【16】Windows再学習の先端-JavaScript実行(一):Promise内のコードはなぜsetTimeoutより先に実行されますか?

2008 ワード

jsは非同期のいくつかの形式を実現します.
  • コールバック関数
  • イベント傍受-イベント駆動モード
  • リリース/購読-観察者モード
  • Promisesオブジェクト
  • js非同期の歴史
  • JavaScriptエンジンはメモリに常駐しています.JavaScriptコードまたは関数を伝えて
  • を実行するのを待っています.
  • はES 3ともっと早いバージョンの中で、JavaScript自身はまだ例外的にコードを実行する能力がなくて、エンジンはコードを直接順次実行して、この任務は宿主の発起する任務です.
  • はES 5の後に、JavaScriptがPromiseを導入しました.このように、ブラウザの手配は不要です.JavaScriptエンジン自体も任務を開始することができます.
  • 巨視的任務
  • マクロタスク:宿主が開始したタスクは、各セグメントjsコードの実行プロセスは、実際にはマクロタスクです.
  • マイクロタスク:JavaScriptエンジンが開始するタスク-JSエンジンレベル
  • 関係:マクロタスクの各キューを維持するためには、JavaScriptのPromiseが非同期コードを生成します.JavaScriptは、これらの非同期コードがマクロタスクの中で
  • を完了することを保証しなければなりません.
  • Promiseは、常に列の最後に微視的タスクを追加します.
  • setTimeoutなどのホストAPIは、マクロタスク
  • を追加します.
  • 実行順序:
  • マイクロタスク:所属するマクロタスクキューのすべての同期タスクを実行した後、
  • を実行します.
  • マクロタスク:マクロタスクのトリガルールと呼び出し順序
  • eg:1秒間のPromiseを実行します.1秒のc 1実行が完了しても、enqueのc 2は、dより先に実行されます.これは、タスク優先の原理をよく説明します.
    イベントサイクル
  • 定義:JavaScriptエンジンは、ホスト環境がマクロタスクを割り当てるのを待っています.オペレーティングシステムでは、通常待つ行為はイベントサイクルです.つまり、繰り返し「待つ」
  • です.
  • 機能:ループが終了するかどうか、マクロタスクキューなどの論理
  • を判断する.
  • は、非同期実行の順序をどのように分析しますか?
  • まず、いくつかのマクロタスクがあるかを分析します.
  • マクロタスクごとに、いくつかのマイクロタスクを分析します.
  • は、呼び出し順序に従って、マクロタスクにおけるマイクロタスクの実行順序を決定する.
  • マクロタスクのトリガルールと呼び出し順序に従って、マクロタスクの実行順序を決定する
  • .
  • は、全体の順序を決定します.
  • eg:setTimeoutはコード全体を2つのマクロタスクに分割しました.ここでは5秒でも0秒でも同じです.最初のマクロタスクには、先着同期して実行されるconsolie.log(a)と、consolie.log(b)が含まれています.set Timeout後、第二のマクロタスクの実行は、resoliveを呼び出してから、thenのコードは非同期的に実行されるので、consolone.log(c)を呼び出して、最終的に出力する順序はaであり、b、c
        setTimeout(()=>console.log("d"), 0)
      var r1 = new Promise(function(resolve, reject){
          resolve()
      });
      r.then(() => { 
          var begin = Date.now();
          //     1       ,  ,         c2   setTimeout d       
          while(Date.now() - begin < 1000);
          console.log("c1") 
          new Promise(function(resolve, reject){
              resolve()
          }).then(() => console.log("c2"))
      });
    
  • である.