前言
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')]);
}