settimeout対setimmedium対プロセスネクストティック


間の違いは何ですかsetTimeout(callback, 0) and process.nextTick(callback) ? 方法についてはsetImmediate(callback) ?
表面では、すべての3つの関数が現在のイベントループの後にコールバックを実行するのと同じことをしますが、他の何よりも前に表示されます.求める自然な質問は、なぜ3つの異なる機能がありますか?実験を実行しましょう
let racer = function() {
  setTimeout(() => console.log("timeout"), 0);
  setImmediate(() => console.log("immediate"));
  process.nextTick(() => console.log("nextTick"));
  console.log("current event loop");
}

racer()
これらのコールバックがソースコードに書かれたのと同じ順序で実行されないことを出力から見ることができます.
[Running] node "/Users/logicmason/timeouts.js"
current event loop
nextTick
timeout
immediate

[Done] exited with code=0 in 0.203 seconds

解説
最初に実行したものはprocess.nextTick , これはイベントキューの先頭にコールバックを置く.これは、現在実行中のコードの後に実行されます.
次は"timeout "です.過ぎてからsetTimeout 0のタイムアウトは、実行前に追加強制遅延されず、次のループ中にタイマーキューに置かれます.
最後に、我々はsetImmediate , 明らかに、その名前が示唆するように、それは明白でありません!そのコールバックはイベントループの次のサイクルのチェックキューに置かれる.チェックキューはタイマキューよりも遅いので、setimmediateはsettimeout 0より遅くなります.
すべての場合、イベントループは次のようになります.timers -> IO -> poll -> check -> close -> timers -> ...
タイマ:からのコールバックsetInterval or setTimeoutIO callback : I/Oイベントからのコールバック
アイドル:IOと投票段階の間のノードによって内部的に使用されます
poll :新しいI/Oイベントを取得する
からのコールバックsetImmediate ここで実行
close :ソケットのような接続接続を閉じる

チャレンジタイム!
次のコードの出力はノードにあると思いますか?
let racer1 = function() {
  setTimeout(() => console.log("timeout"), 0);
  setImmediate(() => console.log("immediate"));
  process.nextTick(() => console.log("nextTick"));
}

let racer2 = function() {
  process.nextTick(() => console.log("nextTick"));
  setTimeout(() => console.log("timeout"), 0);
  setImmediate(() => console.log("immediate"));
}

let racer3 = function() {
  setImmediate(() => console.log("immediate"));
  process.nextTick(() => console.log("nextTick"));
  setTimeout(() => console.log("timeout"), 0);
}

racer1()
racer2()
racer3()
それはあなたが期待したものでしたか?
より多くのコンテンツを購読するlogicmason.com