鍍金池/ 問答/HTML/ 為什么setTimeout永遠比setImmediate早?

為什么setTimeout永遠比setImmediate早?

setImmediate(function A() {
    console.log('2')
})
setTimeout(function B() {
    console.log('1')
}, 0)

從網(wǎng)上的文章來看,理論上應(yīng)該是setImmediate更快(放到task隊列的前面),然而實際并不是如此。(Node 9.x)

回答
編輯回答
離殤

做了一下實驗,用node多運行幾次,發(fā)現(xiàn)執(zhí)行順序誰先誰后都是不一定的,但是大多數(shù)情況,setTimeout更快。

var recordA = {};
var recordB = {};
var MAX = 100;

function output(index) {
  if (index === MAX) {
    console.log('setImmediate:' + Object.keys(recordA).length);
    console.log('setTimeout:  ' + Object.keys(recordB).length);
  }
}

for (var i = 0; i <= MAX; ++i) {
  (function (_i) {
    setImmediate(function A() {
      if (!recordB.hasOwnProperty(_i)) {
        recordA[_i] = 'done';
        output(_i);
      }
    });

    setTimeout(function B() {
      if (!recordA.hasOwnProperty(_i)) {
        recordB[_i] = 'done';
        output(_i);
      }
    }, 0);
  })(i);
}

node版本9.2.0

然后這個setImmediate目前在瀏覽器里只有IE自娛自樂。

2017年10月3日 20:31