首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js setImmediate意外行为

node.js setImmediate意外行为
EN

Stack Overflow用户
提问于 2015-09-25 17:22:05
回答 1查看 113关注 0票数 1

据我所知,process.nextTick()setImmediate()之间的区别如下:

  1. process.nextTick()计划的回调将在进入下一个事件循环之前全部执行,而由setImmediate()调度的回调只会在每个事件循环中执行一个。
  2. 基于上述特点,可以说:process.nextTick()的递归调用会导致程序挂起,而setImmediate()的递归调用则不会。

然后我编写了一些测试代码来验证上面的语句,下面是我的代码:

代码语言:javascript
复制
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()的行为

代码语言:javascript
复制
//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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-25 17:39:28

实际上,您的测试结果看起来很好(我只指第一个测试)。您的注释"setImmediate()“将只执行一个事件循环。是错误的,请参阅arg,这就是您不理解第一个测试结果的原因。

基本上,process.nextTick将把您的函数放在当前事件循环的末尾,而setImmediate将把它放在下一个事件循环中。

但是执行多个setImmediate是可以的,它们都会转到相同的下一个事件循环。

在……里面

代码语言:javascript
复制
setImmediate(function() {
    console.log('setImmediate1');
    process.nextTick(function() {
        console.log('nextTick3');
    });
});

setImmediate(function() {
    console.log('setImmediate2');
});

基本上,您已经将两个函数放在下一个事件循环中调用,在其中一个函数中,您放置了另一个nextTick,它将在同一周期结束时调用,但在同一周期结束时调用。因此,它将首先调用这2个setImmediate,而不是第一个调用的nextTick。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32787515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档