自己的Promise

Posted amiezhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己的Promise相关的知识,希望对你有一定的参考价值。

废话不多说,直接上代码:

class myPromise 
  constructor(fn) 
    this.status = ‘pending‘;
    this.resolveCbs = [];
    this.rejectCbs = [];
    this.value = null;
    fn(this._resolve.bind(this), this._reject.bind(this))
  
  _resolve(val) 
    this.value = val;
    this.status = ‘resolved‘;
    this.resolveCbs.forEach(cb => 
      cb(this.value);
    )
  
  _reject(err) 
    this.value = err;
    this.status = ‘rejected‘;
    this.rejectCbs.forEach(cb => 
      cb(this.value);
    )
    // 如果没有处理函数,则直接抛错
    if (this.rejectCbs.length === 0) 
      throw err
    
  
  then(resolveCb, rejectCb) 
    if (this.status === ‘resolved‘) 
      resolveCb(this.value);
     else if (this.status === ‘rejected‘) 
      rejectCb(this.value);
     else 
      return new myPromise((resolve, reject) => 
        if (typeof resolveCb === ‘function‘) 
          this.resolveCbs.push(res => 
            this._handleCb(resolveCb, res, resolve, reject);
          )
        
        if (typeof rejectCb === ‘function‘) 
          this.rejectCbs.push(res => 
            this._handleCb(rejectCb, res, resolve, reject);
          )
        
      )
    
  
  catch(rejectCb) 
    return this.then(null, rejectCb)
  
  _handleCb(cb, res, resolve, reject) 
    try 
      const ret = cb(res)
      if (ret instanceof Promise || ret instanceof myPromise) 
        ret.then(res => resolve(res))
       else 
        resolve(ret)
      
     catch (err) 
      reject(err)
    
  

new myPromise((resolve, reject) => 
  setTimeout(() => 
    resolve(456)
  , 1000);
).then(res => 
  console.log(res)
  throw ‘hualala‘
).catch(err => 
  console.log(‘heng!!!‘)
  return new myPromise((resolve, reject) => 
    setTimeout(() => 
      reject(233)
    , 1000);
  )
).then(res => 
  console.log(res)
)

这个简版的Promise已经可以实现到链式的地步了, 如果return是一个非Promise,则直接resolve,如果是Promise,则等then再resolve

以上是关于自己的Promise的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:用 promise 编写自己的方法

自己的Promise

假设把官方的promise.all去掉,实现自己的promise.all方法

自己的Promise

JavaScript进阶深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise

自己实现ES6中的Promise API