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

2022-08-30 01:07:17

我有一个纯粹的JavaScript承诺(内置实现或poly-fill):

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

规范中可以看出,承诺可以是以下之一:

  • “已解决”和“已解决”
  • “已解决”和“已拒绝”
  • “待定”

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

  • 应许已经确定了吗?

  • 如果是这样,承诺是否得到解决?

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

这个问题是关于对承诺状态的同步询问。我怎样才能做到这一点?


答案 1

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

Userland库可以做到这一点,如果你的目标是一个特定的引擎(如v8)并且有权访问平台代码(也就是说,你可以在核心中编写代码),那么你可以使用特定的工具(如私有符号)来实现这一点。这是超级具体的,而不是在用户空间中。


答案 2

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

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