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

由于许多node.js脚本遵循一种asynchronous模式(下面的例子),他们如何知道何时停止?

在下面的代码中,node是如何在处理writeFile之后确定的,并且正确地注册callback函数,直到callback函数运行,这个过程应该保持活跃状态​​。

fs = require('fs'); fs.writeFile('foo', 'cat', function() { console.log('wrote to foo!'); fs.readFile('foo', 'utf8', function(err, data) { console.log(data); }); }); 

节点跟踪所有未完成的工作请求。 您的fs.writefile()调用将为I / O创build一个工作请求,并将您的callback添加到该请求中。 节点将工作请求保存到其表中,同时启动I / O活动。 到达函数结束时,您的代码执行会退出。 (但你的内存/variables/等仍然存在)

稍后,I / O完成,节点将工作请求从其表中取出。 它看到附加到请求的callback,因此调用与I / O请求的结果一起工作。 你的全局数据仍然存在,闭包中的任何variables仍然存在,所以你的代码似乎从未停止过。

如果你什么都不做,不要再做任何请求,那么当你从函数返回的时候,节点将停止,因为那样队列中就不会有任何剩余的请求了。

因此节点“知道”继续运行,因为它跟踪表中的活动工作请求,并且不会停止,直到所有排队的工作完成并且这些表都是空的。

请注意,“排队工作”可能包括诸如等待计时器或等待networking数据到达等事情。 你提出一个请求,说:“如果以后有事情发生,请打电话给我。”

setTimeout()也是一个工作请求(如果你眯了一下)。 有了计时器,你知道会发生什么事情,什么时候会发生。 用setTimeout()只会有一个'东西'发生。 节点只会对您的callback进行一次调用,然后“忘记”工作请求。 如果你使用setInterval(),你已经创build了一个持久的工作请求。 节点会在工作表中“保留”工作请求,并会重复调用您的callback,直到您取消请求。

net.Server.listen()是另一个工作请求,这是一个持久的工作请求。 你不知道什么时候你的callback将被调用或多less次,因为这取决于连接到你的服务器的远程客户端。 节点将工作请求保持在其表中,直到您取消请求。