成功の後、約束では、我々は待ち状態があるかもしれない、状態ステータスを失敗していないので、私たちは状態が処理されるのを待つ必要はあり
関数プロミス(エグゼキュータ){ 自己せ = この; self.value = nullを。 self.reason = nullを。 self.resolveCallback = []; self.rejectCallback = []; // 设置默认状态 self.status = ' ペンディング' // 成功函数 関数解決(値){ 場合(self.status == ' ペンディング' ){ self.statusは = ' 成功を' 。 //console.log(self.value); self.value = ' 成功操作' ; self.resolveCallback.forEach(FN =>のFn()); // パブリッシャ } }; // この関数は失敗した 関数は、{(理由)を拒否 IF(self.status == ' 保留' ){ self.status = ' 失敗' ; self.reason = 'は、実行に失敗' ; self.rejectCallback.forEach(FN =>のFn()); // パブリッシャ } } // デフォルトの機能がすぐに二つのパラメータ渡して実行される エグゼキュータ(解決、拒否); } Promise.prototype.then = 関数(OnResolve、OnRejectを){ // はconsole.log(this.value) IF(この .status == ' 成功' ){ OnResolve(この.Valueの); } IF(この .status == ' 失敗' ){ OnReject(この.reason); } // 第三の状態、待機状態における IF(この .status == ' 保留' ){ // 成功したコールバックresolveCallbackプッシュするこの配列 この .resolveCallback.pushは(()=> { OnResolve(この.Valueの); }) // コールバックは、このアレイはrejectCallbackプッシュに失敗 この .rejectCallbackを.push(()=> { OnReject(この.reason); }) } }; module.exportsは = プロミス; // 関数実行部は、我々はこの方法が再び呼び出す二つの引数に来る実行を開始し、その後、メソッド方法があるOnResolve 、OnRejectメソッド // そしてアプローチは、我々は、異なる機能の状態に応じて、通話開始の状態を持って保留され、 //私たちは、開始状態として決定2つの異なる機能では、すべての保留中=>成功したか=保留>失敗している // 変更された状態、および表示値が決定されます
これは保留中の状態を考慮すれば、その後判定処理で我々は最初の状態、我々はそれに対処します
成功コールバック配列を宣言するために最初の状態は、空の障害ステータスコールバック配列が空であります
self.resolveCallback = [];
self.rejectCallback = [];
待機状態でのコールバックの配列は、我々は国の成功をプッシュする成功したコールバック関数の配列になり、プッシュが失敗した状態で機能するために失敗します
// 成功したコールバックresolveCallbackプッシュするこの配列 この .resolveCallback.push(()=> { OnResolve(この.Valueのが); }) // コールバックは、この配列をプッシュすることができないrejectCallback この .rejectCallback.pushを( ()=> { OnReject(この.reason); })
私たちは、状態値に渡します
最後に、機能のそれらの実行中に通過するの配列関数は、自分自身を呼び出します
self.resolveCallback.forEach(FN =>のFn()); // リリース