有没有办法判断 ES6 承诺是不是被履行/拒绝/解决? [复制]

Posted

技术标签:

【中文标题】有没有办法判断 ES6 承诺是不是被履行/拒绝/解决? [复制]【英文标题】:Is there a way to tell if an ES6 promise is fulfilled/rejected/resolved? [duplicate]有没有办法判断 ES6 承诺是否被履行/拒绝/解决? [复制] 【发布时间】:2014-02-24 11:18:07 【问题描述】:

我习惯了 Dojo 的承诺,我可以做到以下几点:

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

有没有办法确定 ES6 承诺是否被履行、解决或拒绝?如果没有,有没有办法使用Object.defineProperty(Promise.prototype, ...) 填充该功能?

【问题讨论】:

如果我没记错的话,你应该可以访问状态并解析值people.mozilla.org/~jorendorff/… [[<name>]] 形式的内部插槽的意图是无法访问它们,因为它们是实现中可能实际不存在的规范细节。它们用于描述规范的行为,而不是实际对象的运行时布局;所以,不,你不能访问内部状态。 为什么这个问题被标记为重复?这是实际反应较好的问题。另一个只是告诉你你不能做什么,并且没有提供任何关于解决方案的提示。我认为其他问题/答案对于实际解决提出的问题是无用的。 【参考方案1】:

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

function MakeQueryablePromise(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;

这不会像修改原型那样影响所有 Promise,但它确实允许您将 Promise 转换为暴露其状态的 Promise。

【讨论】:

这似乎是错误的。当 promise 被拒绝时,您的实现为 isResolved 返回 false。我会在完成回调中设置 isFulfilled,然后根据设置的 isFulfilled 或 isRejected 计算 isResolved。然而,最简单的方法是在两个回调中设置 isResolved 以及相应的 isFulfilled 和 isRejected 值。 确实您的terminology 似乎搞砸了。您应该使用isSettledisFulfilledisRejected 问题是关于使用标准承诺模拟 Dojo,术语是他们的,不是我的。 这在所有 3 个函数中总是为我返回 false... 请注意,这不会同步工作,即使对于已经解决的 Promise 也不行。例如,console.log(MakeQuerablePromise(Promise.resolve(777)).isResolved()) 给出 false

以上是关于有没有办法判断 ES6 承诺是不是被履行/拒绝/解决? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能在 Promise.all 中捕获所有被拒绝的承诺? [复制]

除了尝试捕获或承诺拒绝之外,有没有办法处理量角器的预期条件?

扩展 Javascript 承诺并在构造函数中解决或拒绝它

履行承诺

.then()方法的意思和用法

模块出口承诺履行完成