了解node.js事件队列和process.nextTick
问题描述:
我无法准确理解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。谢谢。
答
process.nextTick将回调放在将要执行的下一个滴答,而不是在滴答队列的末尾。
Node.js doc(http://nodejs.org/api/process.html#process_process_nexttick_callback)说: “它通常在任何其他I/O事件触发之前运行,但有一些例外。”
setTimeout(callback,0)可能会更像你所描述的。
答
你当然应该阅读提供的链接fgascon,也许
https://github.com/joyent/node/issues/3335 更多的背景。
使用process.nextTick当你想在任何IO之前但在调用上下文返回后调用一些代码时(通常是因为你想在事件发射器上注册监听器,并且需要返回创建的发射器才能注册任何东西)。
不,'setTimeout'的行为方式是一样的。我想我真的在问我应该如何在前一个请求完成之前开始处理http请求。 – alf 2013-04-25 19:20:14
其实,我意识到'setTimeout'完全正是我想要的,所以我很抱歉。但是,如果不允许交互cpu密集型任务和http处理,那么“process.nextTick”究竟是什么? – alf 2013-05-01 08:30:58
“不在结尾处” - 所以,有没有办法在事件队列的末尾推送任意函数? 'setTimeout(fn,0)'是一种推荐的方式还是一种解决方法? – incarnate 2014-01-13 06:45:16