我对nextTick和setImmediate之间的区别感到非常困惑。我在互联网上读过所有关于它们的文档,但我仍然不明白它们是如何工作的。
示例:
function log(n) { console.log(n); }setImmediate
setImmediate(function() {
setImmediate(function() {
log(1);
setImmediate(function() { log(2); });
setImmediate(function() { log(3); });
});
setImmediate(function() {
log(4);
setImmediate(function() { log(5); });
setImmediate(function() { log(6); });
});
});
//1 2 3 4 5 6nextTick
process.nextTick(function() {
process.nextTick(function() {
log(1);
process.nextTick(function() { log(2); });
process.nextTick(function() { log(3); });
});
process.nextTick(function() {
log(4);
process.nextTick(function() { log(5); });
process.nextTick(function() { log(6); });
});
});
//1 4 2 3 5 6为什么会有这样的结果?请用视觉或很容易理解的解释来解释。即使是节点核心开发人员也不同意人们应该如何理解nextTick和setImmediate。
资料来源:
发布于 2013-11-30 04:37:40
考虑以下两个例子:
setImmediate
setImmediate(function A() {
setImmediate(function B() {
log(1);
setImmediate(function D() { log(2); });
setImmediate(function E() { log(3); });
});
setImmediate(function C() {
log(4);
setImmediate(function F() { log(5); });
setImmediate(function G() { log(6); });
});
});
setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
}, 0)
// 'TIMEOUT FIRED' 1 4 2 3 5 6
// OR
// 1 'TIMEOUT FIRED' 4 2 3 5 6nextTick
process.nextTick(function A() {
process.nextTick(function B() {
log(1);
process.nextTick(function D() { log(2); });
process.nextTick(function E() { log(3); });
});
process.nextTick(function C() {
log(4);
process.nextTick(function F() { log(5); });
process.nextTick(function G() { log(6); });
});
});
setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
}, 0)
// 1 4 2 3 5 6 'TIMEOUT FIRED'setImmediate回调是从事件循环中触发的,每次迭代按排队顺序进行一次。因此,在事件循环的第一次迭代中,会触发回调A。然后在事件循环的第二次迭代中,触发回调B,然后在事件循环的第三次迭代中触发回调C等等。这将防止事件循环被阻塞,并允许同时调用其他I/O或计时器回调(例如在第1或第2循环迭代中触发的0ms超时)。
但是,nextTick回调总是在执行当前代码之后立即触发,然后再返回到事件循环。在nextTick示例中,在返回到事件循环之前,我们将执行所有nextTick回调。因为setTimeout的回调将从事件循环中调用,所以在每个nextTick回调完成之前,不会输出文本‘超时值触发’。
发布于 2016-08-03 11:49:55
根据Node.js文档,这两个函数的名称是准确交换
RECOMMENDED) setImmediate() (最佳)
在事件队列中先开火
on) ()( process.nextTick() )(用于特殊情况的,参见后面的示例)
立即开火,在当前文件末尾更多地写一份声明
如果我们有这个代码
setTimeout(function(){
console.log('Hello world 5'); // It's waiting like a normal person at a queue
}, 0);
setImmediate(function(){
console.log('Hello world 4');
// It's like get to last and be take care of first
// but always after of .nextTick and before of setInterval(, 0)
});
process.nextTick(function(){
console.log('Hello world 3'); // It's like be at the bottom at this file
});
console.log('Hello world 1');
console.log('Hello world 2');根据您的请求提供直观的解释:

当您必须在处理process.nextTick()之前发出和事件时,使用它的情况如下:
const EventEmitter = require('events');
const util = require('util');
function MyEmitter() {
EventEmitter.call(this);
// use nextTick to emit the event once a handler is assigned
process.nextTick(function () {
this.emit('event');
}.bind(this));
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
myEmitter.on('event', function() {
console.log('an event occurred!');
});看看这个vide,菲利普·罗伯茨给我们提供了一个关于运行时事件循环的很好的解释,并查看了这个在线事件循环调试器实时测试事件循环的工作方式。
发布于 2013-07-06 13:18:49
我不能为setImmediate复制你的结果。它应该与nextTick相同(在我的测试中也是如此),因为在这种情况下,它们所做的事情几乎是一样的。唯一合理的解释是,setImmediate在某种程度上是同步的,但它不是同步的。
根据NodeJS文档,唯一真正的区别是多个nextTick可能在一个循环迭代中触发(取决于maxTickDepth),而setImmediate每次迭代只触发一次。
https://stackoverflow.com/questions/17502948
复制相似问题