据我所知,process.nextTick()和setImmediate()之间的区别如下:
process.nextTick()计划的回调将在进入下一个事件循环之前全部执行,而由setImmediate()调度的回调只会在每个事件循环中执行一个。process.nextTick()的递归调用会导致程序挂起,而setImmediate()的递归调用则不会。然后我编写了一些测试代码来验证上面的语句,下面是我的代码:
process.nextTick(function() {
console.log('nextTick1');
});
process.nextTick(function() {
console.log('nextTick2');
});
setImmediate(function() {
console.log('setImmediate1');
process.nextTick(function() {
console.log('nextTick3');
});
});
setImmediate(function() {
console.log('setImmediate2');
});我的预期结果应该是
nextTick1,nextTick2,setImmediate1,nextTick3,setImmediate2
但我真正得到的是
nextTick1,nextTick2,setImmediate1,setImmedate2,nextTick3
然后我运行了另一个测试来研究setImmediate()的行为
//the following code is using express as the framework
app.get('/test', function (req, res) {
res.end('The server is responding.');
});
app.get('/nexttick', function (req, res) {
function callback() {
process.nextTick(callback);
}
callback();
res.end('nextTick');
});
app.get('/setimmediate', function (req, res) {
function callback() {
setImmediate(callback);
}
callback();
res.end('setImmediate');
});Step1:我在浏览器上访问了http://localhost:3000/nexttick,得到了文本nexttick。
Step2:我访问http://localhost:3000/test是为了测试我的服务器是否还在响应请求,而我没有得到任何响应,浏览器一直在等待响应。这并不奇怪,因为process.nextTick()的递归调用挂起了服务器。
Step3:我重新启动了服务器。
Step4:我访问了http://localhost:3000/setimmediate,得到了文本setimmediate
Step5:我再次访问了http://localhost:3000/test来测试我的服务器是否还在响应。结果和Step2一样,我没有得到任何响应,浏览器一直在等待响应。
这意味着process.nextTick()和setImmediate()的行为基本相同,但我知道它们不是。
我想知道为什么会发生这种事,或者我误解了某事物。谢谢。
我在Windows 10下运行Node v0.12.7。
发布于 2015-09-25 17:39:28
实际上,您的测试结果看起来很好(我只指第一个测试)。您的注释"setImmediate()“将只执行一个事件循环。是错误的,请参阅arg,这就是您不理解第一个测试结果的原因。
基本上,process.nextTick将把您的函数放在当前事件循环的末尾,而setImmediate将把它放在下一个事件循环中。
但是执行多个setImmediate是可以的,它们都会转到相同的下一个事件循环。
在……里面
setImmediate(function() {
console.log('setImmediate1');
process.nextTick(function() {
console.log('nextTick3');
});
});
setImmediate(function() {
console.log('setImmediate2');
});基本上,您已经将两个函数放在下一个事件循环中调用,在其中一个函数中,您放置了另一个nextTick,它将在同一周期结束时调用,但在同一周期结束时调用。因此,它将首先调用这2个setImmediate,而不是第一个调用的nextTick。
https://stackoverflow.com/questions/32787515
复制相似问题