由于许多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会将工作请求保持在其表中.
| 归档时间: |
|
| 查看次数: |
6220 次 |
| 最近记录: |