彼らの約束

直接コードでADO、:

クラスmyPromise { 
  コンストラクタ(FN){ 
    この '保留中' .status = この .resolveCbs = [];
    この .rejectCbs = [];
    この .VALUE = nullを
    FN(この ._resolve.bind()、この ._reject.bind())
  } 
  _resolve(ヴァル){ 
    この .VALUE = ヴァル。
    この .statusは= 'を解決します' ;
    この .resolveCbs.forEach(CB => { 
      CB(この.VALUE); 
    }) 
  }
  _reject(ERR){ 
    この .VALUE = ERR。
    この .statusは=「拒否しました」この .rejectCbs.forEach(CB => { 
      CB(この.VALUE); 
    })
  } 
  次に(resolveCb、rejectCb){ 
    場合この .status === '解決' ){ 
      resolveCb(この.VALUE)。
    } そう であればこの .statusが=== '拒否' ){ 
      rejectCb(この.VALUE)。
    } {
       返す 新しいですmyPromise((解決)=>拒否{
         場合typeof演算 resolveCb === '関数' ){
           この .resolveCbs.push(RES => {
             この._handleCb(resolveCb、RESは、解決、拒否); 
          })
        } 
        であればtypeof演算 rejectCb === '関数' ){
           この .rejectCbs.push(RES => {
             この._handleCb(rejectCb、RESは、解決、拒否); 
          })
        } 
      })
    } 
  } 
  キャッチ(rejectCb){
     戻り 、これを.then(ヌル、rejectCb)
  } 
  _handleCb(CB、RES、解決、リジェクト){ 
    試みる{ 
      CONST RET = CB(RES)
       場合(RET のinstanceofプロミス|| RET instanceofのmyPromise){ 
        ret.then(RES => 解決(RES ))
      } { 
        解決(RET)
      } 
    } キャッチ(ERR){ 
      リジェクト(ERR)
    } 
  } 
} 
新しい myPromise((決意、リジェクト)=> { 
  たsetTimeout(() => { 
    解決(456 
  }、 1000年)。
})。次に、(RES => { 
  にconsole.log(RES)
  スロー 'hualala' 
})。キャッチ(ERR => { 
  にconsole.log( 'ヘン!!!' を返す 新しい myPromiseを(解決=> { 
    たsetTimeout(() => { 
      解決( 233 
    }、 1000年); 
  })
})。次に、(RES = > { 
  にconsole.log(RES)
})

 

プロミスの単純なバージョンは、既に復帰が非プロミスである場合チェーンは、直接ので、再度プロミス場合、解決、およびポイントに解決を達成することができます

おすすめ

転載: www.cnblogs.com/amiezhang/p/8006370.html