如何同步确定 JavaScript Promise 的状态?

新手上路,请多包涵

我有一个纯 JavaScript Promise(内置实现或 poly-fill):

var promise = new Promise(function (resolve, reject) { /* ... */ });

根据 规范,Promise 可以是以下之一:

  • “解决”和“解决”
  • “解决”和“拒绝”
  • ‘待办的’

我有一个用例,我希望同步询问 Promise 并确定:

  • Promise 解决了吗?

  • 如果是这样,Promise 是否已解决?

我知道我可以使用 #then() 来安排在 Promise 更改状态后异步执行的工作。我不是在问如何做到这一点。

这个问题专门针对 Promise 状态的同步询问。我怎样才能做到这一点?

原文由 jokeyrhyme 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 467
2 个回答

对于原生 JavaScript 承诺,不存在此类同步检查 API。 用原生的 promise 是不可能做到这一点的。规范没有指定这样的方法。

Userland 库可以做到这一点,如果您针对特定的引擎(如 v8)并且可以访问 _平台代码_(也就是说,您可以在 core 中编写代码),那么您可以使用特定的工具(如私有符号)来实现这一点.这是非常具体的,但不在用户领域。

原文由 Benjamin Gruenbaum 发布,翻译遵循 CC BY-SA 3.0 许可协议

不,没有同步 API,但这是我的异步版本 promiseState (在@Matthijs 的帮助下):

 function promiseState(p) {
  const t = {};
  return Promise.race([p, t])
    .then(v => (v === t)? "pending" : "fulfilled", () => "rejected");
}

var a = Promise.resolve();
var b = Promise.reject();
var c = new Promise(() => {});

promiseState(a).then(state => console.log(state)); // fulfilled
promiseState(b).then(state => console.log(state)); // rejected
promiseState(c).then(state => console.log(state)); // pending

原文由 jib 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题