我一直在研究JavaScript一段时间,我似乎无法理解为什么下面的代码不起作用。我尝试使用semaphore-ish技术使主执行行等待异步函数调用的结束。您可以在这里查看代码:
var fs = require("fs");
var data = "";
var asyncDone = false;
var fstream = fs.createReadStream("text.txt");
fstream.setEncoding("utf-8");
fstream.on("data", function (chunk) {
data += chunk;
});
fstream.on("end", function() {
console.log("reading done");
console.log(data);
asyncDone = true;
});
while (! asyncDone) { }
console.log("program terminating");
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:2)
问题是对event loop.
的误解简而言之,JavaScript有一个事件队列,所有异步事件都放在其中。只要JS引擎当前没有忙,即当前没有代码正在执行,它就会从事件队列中提取下一个事件。
您的异步处理程序已被推送到事件队列,但您的while
循环阻止执行结束,因此引擎永远无法运行队列中的下一个事物。
想象它的一种方式是:
var eventQueue = [];
function addToQueue(f) {
eventQueue.push(f);
}
function runNext() {
if (eventQueue.length) {
var f = eventQueue.shift();
f();
runNext();
}
}
addToQueue(function() {
// Note that in reality the binding occurs synchronously,
// it's just that the callback will occur asynchronously
fstream.on('data', function(chunk) {
// ...
});
});
while (!asyncDone) { }
runNext();