理解node.js事件队列和process.nextTick

时间:2013-04-25 17:06:20

标签: javascript node.js callback eventqueue

我无法确切了解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后排队多次,callback仅在{foo排队1}}完成了。

如果我对这是如何工作正确的,我认为结果将如下:

received
received
received
received
bar
bar
bar
bar

但它没有,它只是顺序的:

received
bar
received
bar
received
bar
received
bar

我看到foo在执行预期的callback之前正在返回,但似乎callback是NEXT在行,而不是在队列的末尾,在所有的后面请求进来。这是它的工作方式吗?也许我只是不明白节点中的事件队列是如何工作的。请不要指出我here。感谢。

2 个答案:

答案 0 :(得分:2)

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

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

setTimeout(callback,0)可能更像你描述的那样工作。

答案 1 :(得分:1)

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

https://github.com/joyent/node/issues/3335 了解更多背景信息。

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