settimeout対setimmedium対プロセスネクストティック
7073 ワード
間の違いは何ですか
表面では、すべての3つの関数が現在のイベントループの後にコールバックを実行するのと同じことをしますが、他の何よりも前に表示されます.求める自然な質問は、なぜ3つの異なる機能がありますか?実験を実行しましょう
解説
最初に実行したものは
次は"timeout "です.過ぎてから
最後に、我々は
すべての場合、イベントループは次のようになります.
タイマ:からのコールバック
アイドル:IOと投票段階の間のノードによって内部的に使用されます
poll :新しいI/Oイベントを取得する
からのコールバック
close :ソケットのような接続接続を閉じる
チャレンジタイム!
次のコードの出力はノードにあると思いますか?
より多くのコンテンツを購読するlogicmason.com
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 setTimeout
IO 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
Reference
この問題について(settimeout対setimmedium対プロセスネクストティック), 我々は、より多くの情報をここで見つけました https://dev.to/logicmason/settimeout-vs-setimmediate-vs-process-nexttick-3lj2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol