node.js进程如何知道何时停止?

Dan*_*n G 38 node.js

由于许多node.js脚本遵循异步做某事的模式(下面的示例),他们如何知道何时停止?

在下面的代码中,节点在处理writeFile之后如何确定并适当地注册回调,该进程应该保持活动直到回调运行?

fs = require('fs');

fs.writeFile('foo', 'cat', function() {
  console.log('wrote to foo!'); 
  fs.readFile('foo', 'utf8', function(err, data) {
    console.log(data);
  });
}); 
Run Code Online (Sandbox Code Playgroud)

She*_*nme 46

节点跟踪所有未完成的工作请求.您的fs.writefile()调用会为I/O创建工作请求,并将您的回调添加到该请求中.节点在启动I/O活动的同时将工作请求保存到其表中.到达函数末尾时,代码执行将退出.(但你的记忆/变量/等等仍然存在)

稍后I/O完成并且节点从其表中获取工作请求.它看到附加到请求的回调,因此使用I/O请求的结果调用该函数.您的全局数据仍然存在,并且闭包中的任何变量仍然存在,因此您的代码似乎从未停止过.

如果您不再执行任何操作,请不要再发出任何请求,那么当您从函数节点返回时,将停止,因为这样队列中将不会有任何剩余请求.

因此节点"知道"继续运行,因为它跟踪其表中的活动工作请求,并且在所有排队工作完成且这些表为空之前不会停止.

请注意,"排队工作"可能包括等待计时器或等待网络数据到达等内容.你提出的请求是"如果以后发生某事,请在这里给我打电话".

setTimeout()也是一个工作请求(如果你斜视一下).通过计时器,您可以知道会发生什么事情以及什么时候会发生.使用setTimeout()只会发生一个'某事'.node只会调用一次回调,然后"忘记"工作请求.相反,如果使用setInterval(),则创建了持久性工作请求.node会将工作请求"保留"在其表中并重复调用您的回调,直到您取消该请求.

net.Server.listen()是另一个工作请求,它是一个持久的工作请求.您不知道何时调用回调或多少次,因为这取决于连接到服务器的远程客户端.在您取消请求之前,node会将工作请求保持在其表中.

  • 工作请求和表格的概念是否构成了您的观点,或者是节点实现中使用的实际构造?我问,因为我没有看到这些术语在其他地方使用过. (15认同)