繁体   English   中英

node.js中的信号灯-使用计数器变量

[英]Semaphores in node.js - using a counter variable

我已经学习JavaScript已有一段时间了,但似乎无法理解以下代码为什么不起作用。 我试图使用信号量式技术使主执行线等待异步函数调用的结束。 您可以在这里查看代码:

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有一个事件队列,所有异步事件都放入其中。 只要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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM