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

knp*_*wrs 46 javascript promise ecmascript-6

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

promise.isFulfilled();
promise.isResolved();
promise.isRejected();
Run Code Online (Sandbox Code Playgroud)

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

chu*_*ckj 46

它们不是规范的一部分,也没有一种标准的访问方式,可以用来获得构建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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,这不会同步工作,即使对于已经解决的承诺也是如此。例如,“console.log(MakeQuerablePromise(Promise.resolve(777)).isResolved())”给出“false”。 (3认同)
  • 这似乎是错误的.当promise被拒绝时,您的实现为isResolved返回false.我将在完成回调中设置isFulfilled,然后根据isFulfilled或isRejected设置计算isResolved.然而,最简单的方法是在两个回调中设置isResolved以及各自的isFulfilled和isRejected值. (2认同)
  • 事实上你的[术语](http://stackoverflow.com/q/29268569/1048572)似乎搞砸了.你应该使用`isSettled`,`isFulfilled`和`isRejected`. (2认同)
  • 问题是关于使用标准承诺来模拟Dojo,术语是他们的,而不是我的. (2认同)
  • 在所有 3 个函数中,这对我来说总是返回 false... (2认同)