이 글은 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는 추론이 가능해진다.

PromiseFulfillment, 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)
});