手書きの約束Liteの

いくつかの単語の男は、コードに直接、言いました

ES5モジュラーパッケージを介して、外側にプロパティを暴露

(関数(ウィンドウ){

  PENDINGのconst = '保留';

  constの決議=「成就」

  CONSTが拒否=「拒否」

  関数MyPromise(excutor){

    constの自己=この; //プロミスオブジェクト、非同期実行、およびデータを防止する方法保存が必要な取得します

    self.value =未定義。

    self.status = PENDING。

    状態が変化しない場合self.callbacks = [] //、格納する必要があるからコールバック関数は、コールバックメソッドを取得します。

    関数解決(値){

      self.value =値。

      self.status =解決されました。

      self.callbacks.map(CB => {

        setTimeout(()=> {//タイマーシミュレーション混沌のそれ以外の順序、あなたが非同期コールバックの実装を確認する必要があり、非同期で実行

           cb.onResolved(self.value)

        })

      })//正常に保存されたコールバック関数を実行

    }

     関数は、{(値)を拒否します

      self.value =値。

      self.status = REJECTED。 

      self.callbacks.map(CB => {

        setTimeout(()=> {

          cb.onRejected(self.value)

        })

      })//失敗したコールバック関数を保存し実行します

    }

    アクチュエータ機能でイニシアチブは、あなたがキャッチミスする必要がある場合は、エラーをスロー// {みてください、と拒否へのステータス変更

      excutor(解決、拒否)

    }キャッチ(エラー){

      拒否(エラー)

    }

  }

  MyPromise.prototype.then =関数(onResolved、onRejected){

    constの自己=この//保存約束の現在の目標

    {(、解決拒否)新しい約束を返します

      onResolved = onResolved === '関数'?onResolved:V => V

      onRejected = onRejected === '関数' onRejected :?エラー=> {スローエラー} //例外を実装パススルー

      //現在のステータスを確認

      //約束非同期タスクの実行であれば、その方法は同期されている方法は、あなたがコールバックを実行することはできませんので、約束は、保留されている状態では、あなたは保存する必要がある場合

      IF(self.status === PENDING){

        //コールバックここにちょうど保存し、さらに処理する必要がありますので、現在の約束がオブジェクトを変更しないで、治療と同様の成功に対処する必要があります

        各保存self.callbacks.push({onResolved、onRejected})//次にonResolvedを含むオブジェクトのメソッドは、二つの機能をonRejected

      }そうであれば(self.status ===解決済み){

        // 1で、その後非同期実行をコールバック保証、プラスのsetTimeout

        // 2. onResolvedでの主導権がエラーをスローした場合は、エラーをキャプチャする必要があります

        //プロミスオブジェクトの結果によれば、3次のコールバック成功または失敗を決定するために、返されて実行されます

        // 4.プロミスは、リターン2として、値を返した場合、直接実行(2)を解決

        // 5.約束がオブジェクトを返すように約束された場合、結果はpromise.thenにより取得することを約束

        setTimeout(()=> {

          {試します 

             CONST結果= onResolved(self.value)

            (MyPromise instanceofの結果){//戻り値は、オブジェクトの約束でない場合

              //プロミスオブジェクトを返します。

              result.then( 

                値=> {//戻り値はオブジェクトの約束であり、成功し、それはこの機能を実行します

                  解決(self.value)

                }  

                エラーが=> {//戻り値はプロミスオブジェクトであり、失敗し、その機能を実行します

                  rejecte(self.value)

                }

              )  

            約束していない}他{//オブジェクトを返します

               解決(self.value)

            }

          }キャッチ(エラー){

             成功への//プロセス、唯一のコールバック関数を変更する必要があり、私はあまりにも長い間書きません

          }

        })

      }エルス{//拒否状態}  

      }

    }

  window.MyPromise = MyPromise //外側にメソッドを公開

})(窓)

 

ここでは、ほとんどの簡単な約束を書き終え、だけでなく、約束の活用の原理を理解します

クリアしない場合、私を修正してください、だけでなく、というコメント

おすすめ

転載: www.cnblogs.com/vnwith/p/12600643.html