相关链接
代码实现
Promise 的状态
enum States {
PENDING = "pending",
/**
* PENDING 状态,此时该 Promise 的结果是悬而未决的,不知道会被 resolve,或是被 reject。
* 只有当 Promise 的状态为 PENDING 时,resolve 和 reject 函数才可以执行一系列操作,否则只会抛出一个错误。
**/
FULFILLED = "fulfilled",
/**
* FULFILLED 状态,说明此时 Promise 已经被 resolve,“承诺实现了”。
* 当 Promise 的状态为 FULFILLED 时,then 方法传入的 onFullfilled 函数才能直接加入微任务队列;
* 若当前 Promise 的状态为 PENDING,onFullfilled 函数只能加入成功时的回调函数队列。
**/
REJECTED = "rejected",
/**
* REJECTED 状态,说明此时 Promise 已经被 reject,
* 当 Promise 的状态为 REJECTED 时,then 方法传入的 onRejected 函数才能直接加入微任务队列;
* 若当前 Promise 的状态为 PENDING,onRejected 函数只能加入失败时的回调函数队列。
**/
}
相关类型定义
interface Resolve<T> {
(value: T | PromiseLike<T>): void;
}
interface Reject {
(reason?: any): void;
}
interface Executor<T> {
(resolve: Resolve<T>, reject: Reject): void;
}
/**
* Promises/A+ 只是一份规范,任何能通过测试的 Promise 实现都会被这份规范认可,而一些库和框架会实现自己的 Promise,而不是使用原生 ES6 Promise,这就导致了无法直接使用 p instanceof Promise 来识别 Promise类型。
* 因此识别 Promise 是基于鸭子类型(duck typing)检测的,只要是一个 thenable 对象(即定义了 then 方法的对象),即会被识别为 Promise。
* 同理,下文中 resolvePromise 函数的参数 x 是 PromiseLike 类型而不是 Promise 类型。
**/
interface PromiseLike<T> {
then<TResult1 = T, TResult2 = never>(
onFulfilled?: ((value: T | PromiseLike<T>) => TResult1 | PromiseLike<TResult1>) | undefined | null,
onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null
): PromiseLike<TResult1 | TResult2>;
}
MyPromise 类及其构造函数
Promise 接收一个执行器函数作为参数,该执行器函数的两个参数 (resolve, reject) 由 Promise 内部定义。
class MyPromise<T> {
private state: States = States.PENDING; // Promise 的状态
private onFulfilledCbs = [] as (() => void)[]; // 成功时的回调函数
private onRejectedCbs = [] as (()