为什么setTimeout永远比setImmediate早?

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

从网上的文章来看,理论上应该是setImmediate更快(放到task队列的前面),然而实际并不是如此。(Node 9.x)

阅读 2k
1 个回答

做了一下实验,用node多运行几次,发现执行顺序谁先谁后都是不一定的,但是大多数情况,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自娱自乐。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题