获取 Promise 的状态

2,174 阅读1分钟

前言

Promise 是开发中常用到的一个 ES 能力,为异步开发提供了便捷。

Promise 随着 ES 的迭代,提供了很多函数,包括 resolve、reject、race、all 等方法。但是在实际的场景中,也需要拿到 Promsie 的状态,而 Promise 并没有提供这个 Promise.state 能力。

解决方案

方案1 - 手动写一个变量

我们可以在 Promise resolve 和 reject 的地方增加一个变量,譬如

a = new Promise()
promiseState = 'pending'

Promise.resolve().then(()=>promiseState='fullfilled')
Promise.reject().catch(()=>promiseState='rejected')

不过这种方法增加了一个变量,不够好。

方案2 - gePromiseState

另外一种办法就是增加一个 util 来获取 Promise 状态,利用 race 就很好解决了

type PromiseState =
  | 'pending'
  | 'fulfilled'
  | 'rejected';

export async function getPromiseState(p: Promise<unknown>): Promise<PromiseState> {
  return await Promise.race([Promise.resolve(p).then((): PromiseState => 'fulfilled', (): PromiseState => 'rejected'), Promise.resolve().then((): PromiseState => 'pending')]);
}