用 TS 实现 Promise(官方测试工具测试通过)

相关链接

代码实现

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 (() 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值