createReadStream在数据完成处理之前结束激发
createReadStream end fires before data finished processing
我正在尝试执行以下操作:
- 逐行流式传输csv文件
- 修改每行中包含的数据
- 一旦所有行都被流式传输和处理,就完成并继续下一个任务
问题是.on("end")
在.on("data")
完成对每一行的处理之前激发。在.on("data")
处理完所有行之后,我如何让.on("end")
启动?
下面是我所说的一个简单的例子:
import parse from 'csv-parse';
var parser = parse({});
fs.createReadStream(this.upload.location)
.pipe(parser)
.on("data", line => {
var num = Math.floor((Math.random() * 100) + 1);
num = num % 3;
num = num * 1000;
setTimeout( () => {
console.log('data process complete');
}, num);
})
.on("end", () => {
console.log('Done: parseFile');
next(null);
});
提前谢谢。
我认为问题在于data
事件侦听器中的setTimeout
(或任何其他异步任务)。end
在data
之后激发,但异步任务导致它记录消息,即使在流激发end
之后也是如此。
如果你取出setTimeout
,你会看到它记录了end
之前的所有消息。您仍然可以执行异步任务,但可能会有一批异步任务在流结束后运行。
此代码有助于解释发生了什么:
const fs = require('fs')
const testFileName = 'testfile.txt'
fs.writeFileSync(testFileName, '123456789')
let count = 0
const readStream = fs.createReadStream(testFileName, {
encoding: 'utf8',
highWaterMark: 1 // low highWaterMark so we can have more chunks to observe
})
readStream.on('data', (data) => {
console.log('+++++++++++processing sync+++++++++++++')
console.log(data)
console.log('+++++++++++end processing sync+++++++++++++')
setTimeout(() => {
console.log('-----------processing async-------------')
console.log(data)
console.log('-----------end processing async-------------')
}, ++count * 1000)
})
readStream.on('end', () => {
console.log('stream ended but still have async tasks doing their thing')
fs.unlinkSync(testFileName)
})
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- keyup事件处理程序更改焦点不适用于快速键入
- 为什么“;未定义的“;在JavaScript中结束循环
- 如何使用jquery处理php循环通过元素
- angular.js没有'无法在PhoneGap中处理视图标记
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 提示使用服务器端事件处理程序激活JavaScript
- 循环结束/推送到数组之前在页面上呈现EJS
- javascript:如何在antlr生成的Lexer中进行错误处理
- 如何编写一个具有公共标头的批处理
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 如何处理node.js节点mongodb中的连接和查询队列
- 处理第三方库发送的ajax请求的开始和结束事件
- createReadStream在数据完成处理之前结束激发
- 如何使用事件处理程序连续循环遍历数组列表(从结束恢复到开始)
- 如何创建自定义事件来处理所有转换结束事件
- 如何处理在会话结束时打开多个选项卡的情况下注销用户
- Javascript绑定事件处理程序的另一个函数激活/结束
- PHP js处理事件开始日期和结束日期
- 结束/后处理链式方法