Node.js readline line事件回调保证在下次调用之前完成?

时间:2016-08-23 16:58:57

标签: javascript node.js readline

我刚刚修正了一个错误,我正在阅读并使用readline重写文件,并且这些行是不按顺序编写的(最后是由于异步fs.write()调用)。

但我认为发生的一件事是readline line事件以正确的顺序进入,但也许我的某些行的回调函数正在完成另一个{{1}事件已被处理。

演示:

line

上面的最终文件输出如下:

line1 event comes in
line1 event finishes handling
line2 event comes in //Takes a long time to process
line3 event comes in
line3 event finishes handling
line2 event finished handling //And because it was after line3, gets written back after too

我没有在文档中看到任何此类保证,我的测试似乎指出上述情况不可能,但我不确定。上述方案是否可以使用line1 line3 line2

1 个答案:

答案 0 :(得分:3)

NodeJS在单个事件循环上运行JavaScript代码,JavaScript规范称之为作业队列。这意味着,当您的代码响应line2运行时,保证在它仍在运行时不会调用它来响应line3 - 如果在您的代码运行时发生该事件,则调用您的回调的作业将排队但在等待作业队列直到完成,事件循环可以获取队列中的下一个作业。

显然,这仅适用于同步代码,因为异步事物(如fs.write)只启动一个进程,它们不等待它完成;完成是添加到队列中的作业。因此,在下一个事件进入后,异步调用的回调可能会发生。

例如,考虑以下代码:

stream.on("line", function() {
    // do a lot of synchronous work that may tie up the thread for a while
});

你可以确定,当第3行仍在处理第2行的回调时,不会调用你的回调。

但是在处理第2行的回调时:

stream.on("line", function() {
    // Code here IS guaranteed to run before we get called for line 3
    callAnAsyncFunction(function(err, data) {
        // Code here is NOT guaranteed to run before we get called for line 3
    });
    // Code here IS guaranteed to run before we get called for line 3
});