ECMAScript proposal: Promise.withResolvers()

在这篇博客文章中,作者介绍了 ECMAScript 2024 的一个新特性——Promise.withResolvers(),这是一种直接创建 Promises 的新方法,可作为 new Promise(...) 的替代品。

new Promise(...) - 显露构造器模式

此前,只有一种方式可以直接创建 Promise:

const promise = new Promise((resolve, reject) => {
  // ...
});

Promise.withResolvers()

然而,显露构造器模式的局限性在于结束函数 resolve 和 reject 不能离开 Promise 构造器回调而单独使用。这个静态工厂方法解决了这个问题:

const { promise, resolve, reject } = Promise.withResolvers();

以下是使用该工厂方法的例子:

{
  const { promise, resolve, reject } = Promise.withResolvers();
  resolve('fulfilled');
  await promise; // 'fulfilled'
}
{
  const { promise, resolve, reject } = Promise.withResolvers();
  reject('rejected');
  await promise; // 抛出 'rejected'
}

使用案例

  1. Promisifying 回调函数:可以用 Promise.withResolvers() 重写回调函数,例如 node:fs
  2. 单元素队列:示例了一个只含一个元素的队列类,该队列通过 withResolvers 方法获取 Promise 和解决方法。
  3. 任意容量的队列:类 PromiseQueue 是一个潜在的无限队列,其 .get() 阻塞直到有值可用,.put(value) 是非阻塞的。
  4. 异步可迭代的队列:AsyncIterQueue 类实现了 AsyncIterable 接口,可以对其进行异步迭代。

提案解释

最后,该提案指出,许多代码库实现了这一功能,这是它现在被构建进语言中的好消息:React、Vue、Axios、TypeScript、Vite 和 Deno 的标准库等。