Node.js 版本 0.10 今天发布并引入了 setImmediate
。 API 更改 文档建议在执行递归 nextTick
调用时使用它。
从 MDN 的说法 来看,它似乎与 process.nextTick
非常相似。
我什么时候应该使用 nextTick
什么时候应该使用 setImmediate
?
原文由 Benjamin Gruenbaum 发布,翻译遵循 CC BY-SA 4.0 许可协议
Node.js 版本 0.10 今天发布并引入了 setImmediate
。 API 更改 文档建议在执行递归 nextTick
调用时使用它。
从 MDN 的说法 来看,它似乎与 process.nextTick
非常相似。
我什么时候应该使用 nextTick
什么时候应该使用 setImmediate
?
原文由 Benjamin Gruenbaum 发布,翻译遵循 CC BY-SA 4.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 许可协议
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
使用
setImmediate
如果你想在事件队列中已经存在的任何 I/O 事件回调后面排队函数。使用process.nextTick
有效地将函数排在事件队列的头部,以便它在当前函数完成后立即执行。因此,在您尝试使用递归分解长时间运行的、受 CPU 限制的作业的情况下,您现在想要使用
setImmediate
而不是process.nextTick
来排队下一次迭代否则任何 I/O 事件回调都没有机会在迭代之间运行。