手写Promise

type resolve<T> = (value: T | PromiseLike<T>) => void;  
type reject = (reason?: any) => void;  
type executor<T> = (resolve: resolve<T>, reject: reject) => void;  
  
class MyPromise<T> {  
  private result: T | PromiseLike<T> | undefined;  
  private status: 'pending' | 'resolved' | 'rejected' = 'pending';  
  private onResolvedCallbacks: Array<(value: T) => any> = [];  
  private onRejectedCallbacks: Array<(reason: any) => any> = [];  
  
  private resolve(value: T | PromiseLike<T>) {  
    if (this.status !== 'pending') return;  
  
    // If the value is a promise, wait for it to resolve before continuing  
    if (value instanceof Promise || typeof value === 'object' && typeof (value as any).then === 'function') {  
      (value as Promise<T>).then(this.resolve.bind(this), this.reject.bind(this));  
    } else {  
      this.result = value;  
      this.status = 'resolved';  
      this.onResolvedCallbacks.forEach(fn => fn(this.result as T));  
    }  
  }  
  
  private reject(reason: any) {  
    if (this.status !== 'pending') return;  
  
    this.status = 'rejected';  
    this.onRejectedCallbacks.forEach(fn => fn(reason));  
  }  
  
  constructor(executor: executor<T>) {  
    executor(this.resolve.bind(this), this.reject.bind(this));  
  }  
  
  then(onfulfilled?: (value: T) => T | PromiseLike<T>, onrejected?: (reason: any) => any): MyPromise<T> {  
    return new MyPromise((resolve, reject) => {  
      // Handle resolved case  
      const fulfilled = (value: T) => {  
        try {  
          let result = onfulfilled ? onfulfilled(value) : value;  
          result instanceof Promise ? result.then(resolve, reject) : resolve(result);  
        } catch (err) {  
          reject(err);  
        }  
      };  
  
      // Handle rejected case  
      const rejected = (reason: any) => {  
        try {  
          let result = onrejected ? onrejected(reason) : reject(reason);  
          result instanceof Promise ? result.then(resolve, reject) : (result !== undefined && resolve(result)) || reject(reason);  
        } catch (err) {  
          reject(err);  
        }  
      };  
  
      switch (this.status) {  
        case 'resolved':  
          fulfilled(this.result as T);  
          break;  
        case 'rejected':  
          rejected(this.result as any);  
          break;  
        case 'pending':  
          this.onResolvedCallbacks.push(fulfilled);  
          this.onRejectedCallbacks.push(rejected);  
          break;  
      }  
    });  
  }  
}  
  
// Example usage:  
new MyPromise<number>((resolve, reject) => {  
  console.log(11);  
  resolve(110);  
}).then(e => {  
  console.log(e);  
  return e + 10; // Chaining example  
}).then(e => {  
  console.log(e); // Should print 120  
});
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值