我刚刚修正了一个错误,我正在阅读并使用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
?
答案 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
});