이 글은 You Don't Know JS 서적을 참고하여 작성하였습니다.
Promise는 지금 또는 나중 시점에 상관없이 동일한 결과를 낼 수 있도록 정규화해주는 도구이다. Promise를 사용하면 미랫값(결과값)을 추론할 수 있게 되는 이점이 있다.
function fetchX() {
return new Promise(function (resolve) {
setTimeout(() => resolve(11), 1000);
})
}
function fetchY() {
return Promise.resolve(22);
}
function add(xPromise, yPromise) {
return Promise.all([xPromise, yPromise])
.then(function (values) {
console.log(...values);
return values[0] + values[1];
});
}
add(fetchX(), fetchY())
.then(function (sum) {
console.log(sum);
});
// 11 22
// 33
위 예제와 같이, 프라미스가 시점에 상관없이 같은 결과를 도출해주기 때문에 미랫값인 values는 추론이 가능해진다.
Promise는 Fulfillment, Rejection 두 가지 중 하나로 Resolve될 수 있고, then() 함수는 Fulfillment, Rejection 함수를 전달받는다.
add(fetchX(), fetchY())
.then(
// Fulfillment
function (sum) {
console.log(sum);
},
// Rejection
function (error) {
console.log(error)
});
fetchX() 또는 fetchY() 함수에서 예기치 못한 에러가 발생한다면 add() 함수가 반환하는 프라미스는 버려지고 Rejection 콜백 함수가 호출된다.
**Promise**는 시간에 의존적인 상태를 외부로 부터 캡슐화하기 때문에 프라미스 자체는 시간에 독립적이다. 따라서, 내부 결과값에 상관없이 예측 가능한 방향으로 구성할 수 있다.
또한, **Promise**는 한 번 Resolve된 후에는 불변성을 유지하여 상태가 그대로 유지되기 때문에 재사용이 가능하다.
결과적으로, **Promise**는 미랫값을 캡슐화하고 조합할 수 있게 해주는 손쉬운 반복 장치이다.
콜백에 대해서 설명하면서, 믿음성에 대한 문제를 제기했었다. Promise는 콜백에 존재하던 믿음성에 대한 문제를 해결하였는데 하나씩 살펴보자.
너무 빨리 호출되는 현상은 주로 동기적/비동기적으로 동작할 지 모르는 상황에서 발생하였다.
Promise는 아래와 같이 아무리 Resolve된 경우라도, then() 함수에 전달한 콜백은 무조건 비동기적으로 부르기 때문에 이 문제에 영향을 받지 않는다.
new Promise(function (resolve) {
resolve(1);
}).then(function cb(arg) {
console.log(arg)
});