理解の約束(3)

成功の後、約束では、我々は待ち状態があるかもしれない、状態ステータスを失敗していないので、私たちは状態が処理されるのを待つ必要はあり

関数プロミス(エグゼキュータ){ 
    自己せ   = この; 
    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()); // リリース

 

おすすめ

転載: www.cnblogs.com/guangzhou11/p/11299673.html