有没有办法判断ES6承诺是否已完成/拒绝/已解决?

时间:2014-01-31 16:50:47

标签: javascript promise ecmascript-6

我习惯了Dojo的承诺,我可以做以下事情:

promise.isFulfilled();
promise.isResolved();
promise.isRejected();

有没有办法确定ES6承诺是否得到满足,解决或拒绝?如果没有,是否有办法使用Object.defineProperty(Promise.prototype, ...)填写该功能?

1 个答案:

答案 0 :(得分:41)

它们不是规范的一部分,也没有一种标准的访问方式,您可以使用它来获取构建polyfill的承诺的内部状态。但是,您可以通过创建包装器将任何标准承诺转换为具有这些值的承诺

function MakeQuerablePromise(promise) {
    // Don't create a wrapper for promises that can already be queried.
    if (promise.isResolved) return promise;

    var isResolved = false;
    var isRejected = false;

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

这不会影响所有的promises,因为修改原型会,但它确实允许你将promise转换为一个公开它的promise。