手写Promise

66 阅读1分钟

写了一个简陋版本的promise实现过程

其中then的实现过程有很大的优化空间 可以使用微任务队列来优化 allSettled的实现没有做

  constructor(executor){
    this.status = 'pedding'
    this.value = undefined;
    this.error = undefined;
    const resolve = (value) => {
      if(this.status == 'pedding'){
        this.status = 'resolve';
        this.value = value
      }
    }
    const reject = (err) => {
      if(this.status == 'pedding'){
        this.status = 'reject';
        this.error = err
      }
    }
    executor(resolve,reject)
  }
  then(onResolve,onRejected){
    if(this.status == 'resolve'){
      onResolve(this.value)
    }
    if(this.status == 'reject'){
      onRejected(this.error)
    }
  }
  catch(onRejected){
    return this.then(undefined,onRejected)
  }
  static resolve(value){
    return new myPromise((resolve,reject) => {resolve(value)})
  }
  static reject(err){
    return new myPromise((resolve,reject) => {reject(err)})
  }
  // 返回所有成功的 有失败的就返回失败的
  static all(promises){
    return new myPromise((resolve,reject) => {
      const resolveArr = [];
      promises.forEach(promise => {
        promise.then((res) => {
            resolveArr.push(res);
            if(resolveArr.length === promises.length){
              resolve(resolveArr)
            }
        },err => {
          reject(err)
        })
      });
    })
  }
  static race(promises){
    return new myPromise((resolve,reject) => {
      promises.forEach(promise => {
        promise.then(resolve,reject)
      });
    })
  }
  static any(promises){
    return new myPromise((resolve,reject) => {
      let errorArr = []
      promises.forEach(promise => {
        promise.then((res) => {
          resolve(res)
        },error =>{
          errorArr.push(error);
          if(errorArr.length === promises.length) {
            return (new AggregateError(errorArr))
          }
        })
      });
    })
  }
}