Skip to content

withResolvers

此方法实现了 ES2024(ES15) 引入 Promise.withResolvers 的 ponyfill

基本用法

以下例子展示了如何利用 withResolvers 将一个回调函数模式的交互逻辑更改为异步

js
// 由于历史原因 FileReader API 的交互模式是回调, 这会导致回调地狱
// 而 withResolvers 可以用来解决这个问题
function readFileAsBase64(file: File) {
  const { promise, resolve, reject } = withResolvers<string>()
  const reader = new FileReader()
  reader.readAsDataURL(file)
  reader.onload = function () {
    resolve(reader.result as string)
  }
  reader.onerror = function () {
    reject()
  }
  return promise
}
const fileBase64 = await readFileAsBase64(someFile)

高级用法

除了基本的返回以外, 还可以传入任何与 Promise 构造函数相同签名的构造函数

ts
let res, rej
class NotPromise {
  constructor(executor: any) {
    // `resolve` 和 `reject` 函数和原生的 `Promise` 的行为完全不同
    // 但 `withResolvers` 会正常返回它们
    executor(
      (value: number) => {
        res = value
      },
      (value: number) => {
        rej = value
      }
    )
  }
  then = noop as any
}
const Res = withResolvers<number>(NotPromise)

Res.resolve(1)
Res.reject(2)
// res = 1, rej = 2

// 这是需要实现的签名
interface PromiseLikeConstructor extends PromiseLike {
  new <T>(
    executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void
  ): PromiseLike<T>
}

基于 Mulan PSL v2 许可发布