promise対象(「承諾」)

4535 ワード

ゼロ、非同期プログラミング:
  • Javascript言語の実行環境は「単一スレッド」の利点が実現するのは簡単で、実行環境は比較的単純である.ただし、一つのドラッグがあれば、後ろの列に並んでプログラム全体の実行を遅らせなければなりません.仮死が現れる.
  • Javascript言語はタスクの実行モードを二つに分けます.同期(Synchronous)と非同期(Aynchronous).
  • 非同期モード:各タスクには1つ以上のコールバック関数があり、前のタスクが終了した後は、次のタスクを実行するのではなく、コールバック関数を実行し、後のタスクは前のタスクの終了を待たずに実行されます.方法:
  • コールバック関数
  • 事件の傍受
  • リリース/購読
  • Promisesオブジェクト
  • この文は主にプロミスについて話します.
    一、プロミスの相手
    1.3つの状態:
  • ペンディング(進行中)
  • fulfilled
  • rejected(失敗しました)が一旦状態が変わると、もう変わりません.つまり、reolved(定型化されている)ということです.
  • pending->fulfilled
  • pending->reject
  • 2.使い方
    (1)promise例を作成します.(関数はパラメータとして、関数のパラメータはreolveとrejectがあります.(成功するか失敗するか、第三のオプションがありますか?略)
    const promise = new Promise(function(resolve, reject) {
      // ... some code
    
      if (/*        */){
        resolve(value);
      } else {
        reject(error);
      }
    });
    
    (2)then方法でそれぞれreolved状態とrejectd状態のコールバック関数を指定します.(失敗は必要ではなく、成功は必要です.)
    promise.then(function(value) {
      // success
    }, function(error) {
      // failure
    });
    
    3.promise.prototype.then()
    (1)Promiseの例はthen方法、すなわちthen方法はプロトタイプオブジェクトPromise.prototypeに定義されています.(プロトタイプについては、ハイレンジ関数の章を見てもいいです.よく分かります.)then方法は、新しいプロミセの例を返します.を選択します.したがって、チェーン表記、すなわち、thenメソッドの後に別のthenメソッドを呼び出すことができます.最初のコールバック関数が完了すると、戻り結果をパラメータとしてパラメータとして、2番目のコールバック関数に入力します.
    getJSON("/posts.json").then(function(json) {
      return json.post;
    }).then(function(post) {
      // ...
    });
    
    (3)前回のコールバック関数は、まだ1つのPromiseオブジェクトに戻る可能性があります.この場合、次のコールバック関数は、Promiseオブジェクトの状態が変化するのを待って呼び出されます.
    4.promise.prototype.cach()
    (1)は.then(null,rejection)の別名で、エラーが発生した場合のコールバック関数を指定します.
    getJSON('/posts.json').then(function(posts) {
      // ...
    }).catch(function(error) {
      //    getJSON                  
      console.log('    !', error);
    });
    
    (2)thenメソッドで指定されたコールバック関数は、運転中にエラーが発生した場合、キャッチ方法で捕獲されます.(3)Promiseオブジェクトのエラーは「泡が発生する」性質を持ち、捕獲されるまで後方に伝達されます.エラーは常に次のcatch文に捕捉されます.
    getJSON('/post/1.json').then(function(post) {
      return getJSON(post.commentURL);
    }).then(function(comments) {
      // some code
    }).catch(function(error) {
      //       Promise     
    });
    
    (4)catchメソッドを使ってエラー処理のコールバック関数を指定していないと、Promiseオブジェクトが投げたエラーは外層コードに伝わらない(だからcatchを使う!)catch方法で戻ってきたのはまだPromiseオブジェクトなので、後でthenメソッドを呼び出すこともできます.
    5.Promise.allとPromise.race
    複数のPromiseの例を、新たなPromiseの例にパッケージします.
    const p = Promise.all([p1, p2, p3]);
    
    allはチームワークのように、一人で失敗したらプロジェクト全体が失敗です.全員成功しなければならないのが最終的な勝利です.
    const p = Promise.race([p1, p2, p3]);
    
    raceは率先して状態を変えると、全体の状態が変わります.その率先して変えた戻り値は、pのコールバック関数に伝えられます.
    6.Promise.resove
    既存のオブジェクトをPromiseオブジェクトに変換する(1)パラメータはPromiseの例であり、何も修正せずにそのままこの例に戻ります.
    (2)パラメータはthenableオブジェクトで、thenメソッドを有するオブジェクトを意味します.
    let thenable = {
      then: function(resolve, reject) {
        resolve(42);
      }
    };
    
    まずこのオブジェクトをPromiseオブジェクトに変換し、すぐにthenableオブジェクトのthenメソッドを実行します.(3)パラメータはthenメソッドの対象ではないか、またはまったく対象ではない場合、新しいPromiseオブジェクトに戻ります.状態はresolovedです.任意のパラメータを持たないPromise.resove方法では、パラメータなしで、直接にresoved状態のPromiseオブジェクトに戻ります.
    7.Promise.reject(reason)
    新しいPromiseのインスタンスを返します.このインスタンスの状態はrejectiedです.
    8.done
    then方法またはcatch方法で終了し、最後の方法でエラーが発生した場合は、(Promise内部のエラーが大局に波及しないため)捕まえられない可能性があります.したがって、done方法を提供します.常にフィードバックチェーンの端端にあり、現可能性のあるエラーを放棄することを保証します.
    asyncFunc()
      .then(f1)
      .catch(r1)
      .then(f2)
      .done();
    
    9.finally
    Promiseオブジェクトの最後の状態に関係なく実行される操作を指定します.doneメソッドとの最大の違いは、パラメータとして通常のコールバック関数を受け入れます.この関数はどうしても実行しなければなりません.
    server.listen(0)
      .then(function () {
        // run test
      })
      .finally(server.stop);
    //     Promise    ,    finally       
    
    10.promise.try()
    const f = () => console.log('now');
    Promise.try(f);
    console.log('next');
    // now
    // next
    
    同期関数を同期させて実行させ、非同期関数を非同期的に実行し、それらに統一されたAPIを持たせる.
    実は、Promise.tryはアナログtryコードブロックで、promise.catchシミュレーションのように、catchコードブロックです.
  • その他のやり方(1)async関数
  • const f = () => console.log('now');
    (async () => f())();
    console.log('next');
    // now
    // next
    //  :async () => f()   f()     。
    //       ,  promise.catch。
    
    (2)new Promise()
    const f = () => console.log('now');
    (
      () => new Promise(
        resolve => resolve(f())
      )
    )();
    console.log('next');
    // now
    // next
    
    二、どんなものにも欠点があります.
    キャンセルできません.一旦作成したらすぐ実行します.コールバック関数がないと、その内部から投げられたエラーは外部に反応しません.pending状態ではどの段階に進行したか分かりません.