node.js中的信号量 – 使用计数器variables

我一直在学习JavaScript一段时间,我似乎无法理解为什么下面的代码将无法正常工作。 我试图使主执行线等待asynchronous函数调用的结束使用信号量技术。 你可以看看这里的代码:

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"); 

任何帮助将不胜感激,谢谢。

问题是对事件循环的误解。

简而言之,JavaScript有一个事件队列,所有的asynchronous事件都被放置在该事件队列中。 只要JS引擎当前不忙,即没有代码正在执行,它将从事件队列中提取下一个事件。

您的asynchronous处理程序已被推送到事件队列中,但是您的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();