Promise的实现


function resolvePromise(promise, result, resolve, reject) {
  if (promise === result) {
    return reject(new TypeError('Chaining cycle detected for promise'));
  }

  if (result instanceof MyPromise) {
    result.then(resolve, reject);
  } else {
    resolve(result);
  }
}

class MyPromise{
  constructor(executor){
    this.status = "pending";
    this.resolveList = [];
    this.rejectList = [];
    
    const resolve = (args)=>{
        if(this.status === "pending"){
           this.status = "fulfilled";
           this.resolveList.forEach((callback) => callback(args));
        }
        
    }

    const reject = (args) => {
        if(this.status === "pending"){
          this.status = "rejected";
          this.rejectList.forEach((callback) => callback(args));
        }
    }

    try {
      executor(resolve, reject);
    } catch (error) {
      reject(error);
    }
  }
  
  then(resolveCallback, rejectCallback){
    resolveCallback = typeof resolveCallback === 'function' ? resolveCallback : (value) => value;
    rejectCallback = typeof rejectCallback === 'function' ? rejectCallback : (reason) => { throw reason; };

    const promise = new MyPromise((resolve, reject) => {
      if (this.status === 'fulfilled') {
        setTimeout(() => {
          try {
            const result = resolveCallback();
            resolvePromise(promise, result, resolve, reject);
          } catch (error) {
            reject(error);
          }
        }, 0);
      }

      if (this.status === 'rejected') {
        setTimeout(() => {
          try {
            const result = rejectCallback();
            resolvePromise(promise, result, resolve, reject);
          } catch (error) {
            reject(error);
          }
        }, 0);
      }

      if (this.status === 'pending') {
        this.resolveList.push(() => {
          setTimeout(() => {
            try {
              const result = resolveCallback();
              resolvePromise(promise, result, resolve, reject);
            } catch (error) {
              reject(error);
            }
          }, 0);
        });

        this.rejectList.push(() => {
          setTimeout(() => {
            try {
              const result = rejectCallback();
              resolvePromise(promise, result, resolve, reject);
            } catch (error) {
              reject(error);
            }
          }, 0);
        });
      }
    });

    return promise;
  }

  catch(onRejected) {
    return this.then(null, onRejected);
  }

  // all promiseList列表中有一个失败 结果就为reject
  all(promiseList){
    const result = [];
    return new MyPromise((resolve,reject)=>{
      promiseList.map((item,i)=>{
        // MyPromise.resolve()用于处理传入值不为Promise的情况
        MyPromise.resolve(item).then((res)=>{
           result[i] = res;
           if(result.length === promiseList.length){
              resolve(result)
           }
        },(err)=>{
          reject(err)
        })
      })
    })
  }

  race(promiseList){
    return new MyPromise((resolve,reject)=>{
      promiseList.map((item,i)=>{
        // MyPromise.resolve()用于处理传入值不为Promise的情况
        MyPromise.resolve(item).then((res)=>{
          resolve(res)
        },(err)=>{
          reject(err)
        })
      })
    })
  }

 retry(fn, count){
     
    return new MyPromise((resolve, reject)=>{
        const fnTemp = function(){
            MyPromise.resolve(fn).then(res=>{
              resolve(res)  
            }, (err) =>{
              if(count === 0){
                  reject(err)
              }else{
                  count--;
                  fnTemp()
              }
              
          })
     }
    return fnTemp

    })

  }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容