我有一个由一系列管道组成的流。
我正在使用event-stream包来创建管道的构建块。
代码从S3获取文件,解压缩,解析并将数据发送到某个异步函数
我试图在完成处理该文件后解除承诺。
我如何确定所有链条已经完成排水?
我目前的解决方案是这样的。
它看起来很糟糕,我仍然认为resolve()
有可能
例如,当gzReader中有数据块时,将调用它。
感谢
const inputStream = this.s3client.getObject(params).createReadStream()
inputStream.on('end',() => {
console.log("Finished handling file " + fileKey)
let stopInterval = setInterval(() => {
if (counter == 0) {
resolve(this.eventsSent)
clearInterval(stopInterval)
}
}, 300)
})
const gzReader = zlib.createGunzip();
inputStream
.pipe(gzReader)
.pipe(es.split())
.pipe(es.parse())
.pipe(es.mapSync(data => {
counter++
this.eventsSent.add(data.data)
asyncFunc(this.destinationStream, data.data)
.then(() => {
counter--
})
.catch((e) => {
counter--
console.error('Failed sending event ' + data.data + e)
})
}))
答案 0 :(得分:2)
因为你永远不会初始化计数器,所以它是零,在前300ms之后,你的函数会解析(可以在你的管道工作之前增加计数器)。
所以不要使用setInterval
;)你不需要它。
如果您已经在其中调用异步函数,则无需使用mapSync。只需使用map并传递数据和回调(https://github.com/dominictarr/event-stream#map-asyncfunction)。不要忘记在异步功能中调用回调!
在管道中添加最后一步:wait(callback)
(https://github.com/dominictarr/event-stream#wait-callback)
在那里你可以解决。