Promise는 콜백 함수 패턴의 단점을 보완하기 위한 디자인 패턴입니다. ES6에서 새롭게 도입된 문법이라기보다는, 코드의 흐름을 보다 읽기 쉽고 관리하기 편하게 만들어 주는 디자인 패턴입니다.
Promise는 성공(resolve) 혹은 실패(reject) 여부를 판단하여 그에 맞는 후속 코드를 실행하도록 합니다. 기본 사용법은 아래와 같습니다.
var 프로미스 = new Promise();
프로미스.then(function() {
// 성공 시 실행할 코드
}).catch(function() {
// 실패 시 실행할 코드
});
new Promise()로 Promise 객체를 생성한 후, then()을 사용해 성공했을 때의 처리, catch()를 사용해 실패했을 때의 처리를 정의합니다.Promise 내부에 전달하는 콜백 함수는 두 개의 인자를 받습니다.
첫 번째는 성공을 나타내는 함수, 두 번째는 실패를 나타내는 함수입니다.
var 프로미스 = new Promise(function(성공, 실패) {
var 어려운연산 = 1 + 1;
성공(); // 연산 성공 시 성공 함수 호출
});
프로미스.then(function() {
console.log('연산이 성공했습니다');
}).catch(function() {
// 실패 시 실행 (여기서는 실행되지 않음)
});
성공()을 호출하면, then()에 등록한 코드가 실행됩니다.var 프로미스 = new Promise(function(성공, 실패) {
var 어려운연산 = 1 + 1;
실패(); // 실패 판정: 실패 함수 호출
});
프로미스.then(function() {
console.log('연산이 성공했습니다');
}).catch(function() {
console.log('실패했습니다');
});
실패() 함수가 호출되면 catch()에 등록한 코드가 실행됩니다.'실패했습니다'가 출력됩니다.연산 결과를 then()에서 활용하고 싶다면, 성공 함수의 인자로 결과를 넘겨주면 됩니다.
var 프로미스 = new Promise(function(성공, 실패) {
var 어려운연산 = 1 + 1;
성공(어려운연산); // 결과를 성공 함수에 전달
});
프로미스.then(function(결과) {
console.log('연산이 성공했습니다: ' + 결과);
}).catch(function() {
console.log('실패했습니다');
});
성공(어려운연산)을 호출하여 어려운연산의 결과가 then() 내부의 인자 결과로 전달됩니다.var 프로미스 = new Promise(function(성공, 실패) {
var 어려운연산 = 1 + 1;
성공(); // 연산이 완료되면 성공 판정
});
프로미스.then(function() {
console.log('연산이 성공했습니다');
}).catch(function() {
// 실패 시 처리 (여기서는 사용되지 않음)
});
then()의 코드를 실행합니다.var 프로미스 = new Promise(function(성공, 실패) {
setTimeout(function() {
성공(); // 1초 후에 성공 판정
}, 1000);
});
프로미스.then(function() {
console.log('1초 대기 성공했습니다');
}).catch(function() {
console.log('실패했습니다');
});
setTimeout을 이용해 1초 후에 성공()을 호출, 그 결과 then()에 등록된 코드가 실행됩니다.상태(state):
pending: Promise 생성 후, 성공/실패 판정 전resolved (또는 fulfilled): 성공 판정 후rejected: 실패 판정 후한번 상태가 결정되면 변경할 수 없습니다.
코드 가독성 향상:
then()과 catch()를 통해 순차적이고 직관적인 코드 흐름을 구현할 수 있습니다.비동기 처리와의 관계:
then(), 실패하면 catch()를 실행하여 이후 코드를 연결합니다.성공, 실패)를 통해 조건에 따라 다른 처리를 수행할 수 있습니다.catch()를 통해 별도의 에러 핸들링이 가능해집니다.