Promise 의 상태를 보려면

관련 포스트

내마음대로 지껄일거야 틀려도몰라 흥흥

javascript Promise 객체에는 세가지 상태가 있다.

  • pending
  • resolved
  • rejected

명칭만 봐도 직관적으로 알겠다.

browser console 창에서는 resolved 로 되어있는데 fulfilled 가 맞는지 잘 모르겠다. 아무튼.

아무튼. 이 상태를 직접 읽어올 방법이 없는 듯 한데..

출처

/**
 * This function allow you to modify a JS Promise by adding some status properties.
 * Based on: http://stackoverflow.com/questions/21485545/is-there-a-way-to-tell-if-an-es6-promise-is-fulfilled-rejected-resolved
 * But modified according to the specs of promises : https://promisesaplus.com/
 */
function MakeQuerablePromise(promise) {
    // Don't modify any promise that has been already modified.
    if (promise.isResolved) return promise;

    // Set initial state
    var isPending = true;
    var isRejected = false;
    var isFulfilled = false;

    // Observe the promise, saving the fulfillment in a closure scope.
    var result = promise.then(
        function(v) {
            isFulfilled = true;
            isPending = false;
            return v;
        },
        function(e) {
            isRejected = true;
            isPending = false;
            throw e;
        }
    );

    result.isFulfilled = function() { return isFulfilled; };
    result.isPending = function() { return isPending; };
    result.isRejected = function() { return isRejected; };
    return result;
}

사용법은 아래와 같다..

그냥 복붙한 것 같아서 꼐림칙하지만.. ㅠㅠ 기록이니깐..

// Your promise won't cast the .then function but the returned by MakeQuerablePromise
var originalPromise = new Promise(function(resolve,reject){
    setTimeout(function(){
        resolve("Yeah !");
    },10000);
});

var myPromise = MakeQuerablePromise(originalPromise);

console.log("Initial fulfilled:", myPromise.isFulfilled());//false
console.log("Initial rejected:", myPromise.isRejected());//false
console.log("Initial pending:", myPromise.isPending());//true

myPromise.then(function(data){
    console.log(data); // "Yeah !"
    console.log("Final fulfilled:", myPromise.isFulfilled());//true
    console.log("Final rejected:", myPromise.isRejected());//false
    console.log("Final pending:", myPromise.isPending());//false
});

간단한 wrapping functionclosure scope 를 이용하여 상태를 알 수 있게 되었다!!