Javascript Node.js事件循环是否忽略读取流数据事件内的setTimeout?
我正在澄清关于Node.js如何执行计时器的疑问。通常,当节点脚本中有setTimeout块时,事件循环(即使没有其他内容)将在setTimeout中等待指定的毫秒,并在运行回调后退出Javascript Node.js事件循环是否忽略读取流数据事件内的setTimeout?,javascript,node.js,event-loop,Javascript,Node.js,Event Loop,我正在澄清关于Node.js如何执行计时器的疑问。通常,当节点脚本中有setTimeout块时,事件循环(即使没有其他内容)将在setTimeout中等待指定的毫秒,并在运行回调后退出 但请考虑下面的代码 const fs=require('fs'); 让readable=fs.createReadStream('large.csv'); readable.on('data',异步块=>{ 让rows=parseCsvRow(块); 试一试{ for(设i=0;i{ console.log('c
但请考虑下面的代码
const fs=require('fs');
让readable=fs.createReadStream('large.csv');
readable.on('data',异步块=>{
让rows=parseCsvRow(块);
试一试{
for(设i=0;i{
console.log('csv文件处理成功');
});
函数someAsyncOperation(){
返回新承诺((解决、拒绝)=>{
setTimeout(resolve,2000);
});
}
我正在阅读的csv文件大约有300行,我正在为每行启动一个ajax请求(为简单起见隐藏代码),运行大约需要100毫秒,我在这里使用setTimeout模拟了它
当我运行上述程序时,它几乎立即退出,而不等待所有挂起的setTimeout计时器成功运行。仅仅因为从读取流上的数据事件内部调度的计时器,事件循环就会忽略它吗?它不应该等待所有计时器执行吗
注意-我知道上面的代码不是我正在做的事情的正确方法,但这只是一个示例,用于演示我很难理解的概念。这与Node.js或事件循环无关
问题在于,您正在将一个异步
函数传递给一个与它返回的承诺无关的东西。这是promise反模式之一。只有在以下情况之一为真时,才将async
函数用作回调:
- 执行回调的对象将使用或返回承诺(例如,
promise.all
,因为它使用它们,或者map
在数组上,因为它返回它们)
- 你不在乎调用你的
async
函数的东西是否继续工作,而你的async
函数可能会在wait
上暂停,并且你将async
函数中的所有内容都包装在处理拒绝的try
/catch
中
特定于Node.js的部分是:如果您想在完成某项操作之前阻止进一步调用数据处理程序,则需要先调用流,然后再调用它。在大多数情况下,我的困惑是因为示例代码中有一个输入错误
这是我的代码中的一个输入错误,someAsyncFunction
中出现了一个未捕获的错误。此未捕获错误导致节点退出程序。我已经修好了,现在它可以正常工作了。问题描述中所示的当前代码正确地等待在节点退出进程之前执行计时器
TL;DR-节点将在退出进程之前等待执行所有计时器。无论计时器是从事件回调还是其他任何地方设置的(也不应该有任何未捕获的错误)我理解第1点,但不理解第2点。我从someAsyncOperation
返回承诺(它在示例代码中),并在setTimeout中解析承诺。“为什么它不等待呢?”维奈-哇,我完全读过了。是的,绝对的,代码里有一个承诺。哇,说到没有正确阅读,很抱歉!我已编辑答案以删除不正确的部分。:-)@t-j-crowder很好。没问题。