node中 setImmediate 和setTimeout的區別

現有以下代碼 : 請現設想輸出結果

const fs = require('fs');

fs.readFile('./index.json', () => {
  setTimeout(() => {
    console.log('fs =》timeout');
  });
  setImmediate(() => {
    console.log('fs =》setImmediate');
  });
});

setImmediate(function () {
    console.log('setImmediate延遲執行'); 
});

setTimeout(function () {
    console.log('setTimeout延遲執行'); 
});

process.nextTick(function () { 
    console.log('nextTick延遲執行');
});

console.log('正常執行');

正確的結果是:

正常執行
nextTick延遲執行
setTimeout延遲執行
setImmediate延遲執行
fs =》setImmediate
fs =》timeout

原因是
執行計時器的順序將根據調用它們的上下文而異。如果二者都從主模塊內調用,則計時將受進程性能的約束(這可能會受到計算機上運行的其它應用程序的影響)。

例如,如果運行的是不屬於 I/O 週期(即主模塊)的以下腳本,則執行兩個計時器的順序是非確定性的,因爲它受進程性能的約束
結論是 :

在   文件I/O 、 網絡I/O中   setImmediate會 先於 settimeout 
否則一般情況下 setTimeout  會先於 setImmediate
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章