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