setImmediate 与 nextTick

新手上路,请多包涵

Node.js 版本 0.10 今天发布并引入了 setImmediateAPI 更改 文档建议在执行递归 nextTick 调用时使用它。

MDN 的说法 来看,它似乎与 process.nextTick 非常相似。

我什么时候应该使用 nextTick 什么时候应该使用 setImmediate

原文由 Benjamin Gruenbaum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 298
2 个回答

使用 setImmediate 如果你想在事件队列中已经存在的任何 I/O 事件回调后面排队函数。使用 process.nextTick 有效地将函数排在事件队列的头部,以便它在当前函数完成后立即执行。

因此,在您尝试使用递归分解长时间运行的、受 CPU 限制的作业的情况下,您现在想要使用 setImmediate 而不是 process.nextTick 来排队下一次迭代否则任何 I/O 事件回调都没有机会在迭代之间运行。

原文由 JohnnyHK 发布,翻译遵循 CC BY-SA 3.0 许可协议

举个例子:

 import fs from 'fs';
import http from 'http';

const options = {
  host: 'www.stackoverflow.com',
  port: 80,
  path: '/index.html'
};

describe('deferredExecution', () => {
  it('deferredExecution', (done) => {
    console.log('Start');
    setTimeout(() => console.log('setTimeout 1'), 0);
    setImmediate(() => console.log('setImmediate 1'));
    process.nextTick(() => console.log('nextTick 1'));
    setImmediate(() => console.log('setImmediate 2'));
    process.nextTick(() => console.log('nextTick 2'));
    http.get(options, () => console.log('network IO'));
    fs.readdir(process.cwd(), () => console.log('file system IO 1'));
    setImmediate(() => console.log('setImmediate 3'));
    process.nextTick(() => console.log('nextTick 3'));
    setImmediate(() => console.log('setImmediate 4'));
    fs.readdir(process.cwd(), () => console.log('file system IO 2'));
    console.log('End');
    setTimeout(done, 1500);
  });
});

将给出以下输出

Start // synchronous
End // synchronous
nextTick 1 // microtask
nextTick 2 // microtask
nextTick 3 // microtask
setTimeout 1 // macrotask
file system IO 1 // macrotask
file system IO 2 // macrotask
setImmediate 1 // macrotask
setImmediate 2 // macrotask
setImmediate 3 // macrotask
setImmediate 4 // macrotask
network IO // macrotask

我希望这可以帮助理解差异。

更新:

使用 process.nextTick() 延迟的回调在触发任何其他 I/O 事件之前运行,而使用 setImmediate(),执行将排在队列中已存在的任何 I/O 事件之后。

Node.js Design Patterns ,作者 Mario Casciaro(可能是关于 node.js/js 的最佳书籍)

原文由 DraganS 发布,翻译遵循 CC BY-SA 4.0 许可协议

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