nodejsタイマーとpromiseの実行順序

5603 ワード

var wait = function (ms) {
  return new Promise((resolve) => {
    console.log("promise"); //promise          ,    
    setTimeout(() => {
      console.log("resolve"); //   
      resolve();
    }, ms);
  });
};

Promise.resolve().then(() => {
  console.log("mocro"); //   
});

setTimeout(() => {
  console.log("timeout"); //   
}, 0);

var delayPrint = async function (ms) {
  console.log("begin");
  await wait(ms);
  console.log("print");
};

delayPrint(0);
//出力順序/begin/promise/mocro/timeout/resove/print
nodejsは単一スレッド非同期ブロックタスクで、ここではシングルパスはユーザのメインスレッドを指し、メインスレッドは時間循環キューに合わせてプログラムを実行します.
メインスレッドは、ユーザ同期コードを実行し、タイマーが発生したときにイベントキューにタイマータスクを置き、プロミセに会ったら関数をマイクロタスクキューに配置する.メインスレッドが同期コードを実行した後、マイクロタスクがあるかどうかを確認し、実行されている場合はマクロタスクを確認し、ある場合は実行します.マイクロタスクでタイマータスクを作成すると、マクロ人物にも挿入されます.
注意したいのは:
  • は、マクロタスクであれ、マイクロタスクであれ、実行主体はユーザのメインスレッドである.
  • 複数のsettimoutタイミングイベントが0の場合、コールバック関数は、ジョブキューの挿入順序に従ってそのコールバック関数を実行する.
  • 上記のコード出力の実行順序は、//1.同期タスク一般プログラムとpromiseの構成文/2.マイクロタスクpromiseのresoveとreject/3.マクロ人物タイマーなどのタイマーのタイミングが同じ場合、確立順に出力します.