ES 6(7)のAsyncとawait

1661 ワード

まずJavaScriptの非同期処理について話します.
JavaScriptは単一スレッドのプログラミング言語であり、非同期処理の仕組みを設計しないと、時間が長いI/Oのためにスレッドが詰まりやすくなり、悪いプログラム体験ができます.
以前に非同期処理を行う方法:
コールバック関数:いくつかのイベントのコールバック関数を設定することで、非同期処理が可能です.
イベント傍受:イベント傍受は基本的にコールバック関数のサポートに基づいています.
リリース/購読:購読を発表するのは良い設計モードで、発表者のイベントを監督して非同期処理を達成します.
Promiseオブジェクト:Promiseオブジェクトは関数のフィードバックの入れ子を解決できますが、コードの横方向発展(チェーン操作の弊害)を招きます.
ES 7のAync
Asyncは、関数の前に設定されたキーワードで、awaitは、async作用領域でのみキーワードを使用することができ、Promiseオブジェクトを傍受することができ、Promiseオブジェクトの状態が変化したときに、後のコード操作が行われる.
いくつかの長所
  • 関数は、良好な縦
  • になります.
  • コードは同期コードのように見える
  • です.
  • は、標準的なtryおよびcatch動作
  • を行うことができる.
        //sleep          
      var sleep = function (time) {
        return new Promise(function (resolve, reject) {
          setTimeout(function () {
            reject() // time     Promise     reject
          }, time);
        })
      };
    
      let hello = async() => { //async           
        try {
            console.log('i am 1')
            await sleep(3000)
            console.log(`this won't happen`)
        } catch (err) {
          console.log('i am 3')
        }
      }
      hello()
      console.log('i am 2')
    
    
    sleepは遅延関数であり、呼び出し時は3000 ms後にPromiseオブジェクトの状態が変化するので、tryのスコープ内ではconsole.log('i am 1')を実行した後に3000 ms待っていますが、asyncスコープのコードは順次下に実行され、console.log('i am 2') ms後に3000 msが実行されます.Promiseオブジェクトの状態がrejectに変化した場合、catchによって検出されるので、tryの中のコードは再実行されず、catchの下のコードが実行される.