2013-04-25 39 views
7

我无法准确理解process.nextTick是如何做的。我想我明白,但我似乎无法复制我的感觉这应该工作:了解node.js事件队列和process.nextTick

var handler = function(req, res) { 
    res.writeHead(200, {'Content-type' : 'text/html'}); 
    foo(function() { 
     console.log("bar"); 
    }); 
    console.log("received"); 
    res.end("Hello, world!"); 
} 

function foo(callback) { 
    var i = 0; 
    while(i<1000000000) i++; 
    process.nextTick(callback); 
} 

require('http').createServer(handler).listen(3000); 

虽然foo是循环的,我会寄过来几个请求,假设handler将排队几次落后foo仅在foo完成时才会使callback排队。

如果我对如何工作正确的,我相信结果会是这样的:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

但它不,它只是顺序:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

我看到foo在执行callback之前正在返回,但这似乎是预期的,但callback似乎是在下一行,而不是在队列的末尾,在所有请求的后面。这是它的工作方式吗?也许我只是不理解节点中事件队列的工作原理。请不要指点我here。谢谢。

回答

2

process.nextTick将回调放在将要执行的下一个滴答,而不是在滴答队列的末尾。

Node.js doc(http://nodejs.org/api/process.html#process_process_nexttick_callback)说: “它通常在任何其他I/O事件触发之前运行,但有一些例外。”

setTimeout(callback,0)可能会更像你所描述的。

+2

不,'setTimeout'的行为方式是一样的。我想我真的在问我应该如何在前一个请求完成之前开始处理http请求。 – alf 2013-04-25 19:20:14

+0

其实,我意识到'setTimeout'完全正是我想要的,所以我很抱歉。但是,如果不允许交互cpu密集型任务和http处理,那么“process.nextTick”究竟是什么? – alf 2013-05-01 08:30:58

+0

“不在结尾处” - 所以,有没有办法在事件队列的末尾推送任意函数? 'setTimeout(fn,0)'是一种推荐的方式还是一种解决方法? – incarnate 2014-01-13 06:45:16

1

你当然应该阅读提供的链接fgascon,也许

https://github.com/joyent/node/issues/3335 更多的背景。

使用process.nextTick当你想在任何IO之前但在调用上下文返回后调用一些代码时(通常是因为你想在事件发射器上注册监听器,并且需要返回创建的发射器才能注册任何东西)。