Javascript 如何判断带有管道的溪流何时完成排水
我有一条由一连串管子组成的小溪。 我正在使用包创建管道的构建块。 代码从S3获取一个文件,解压它,解析它并将数据发送给某个异步函数 我正在努力让承诺在处理完那个文件后得到解决。 我怎样才能确保链条上的水已经排完? 我当前的解决方案是这样的。 它看起来很糟糕,我仍然认为有可能Javascript 如何判断带有管道的溪流何时完成排水,javascript,node.js,Javascript,Node.js,我有一条由一连串管子组成的小溪。 我正在使用包创建管道的构建块。 代码从S3获取一个文件,解压它,解析它并将数据发送给某个异步函数 我正在努力让承诺在处理完那个文件后得到解决。 我怎样才能确保链条上的水已经排完? 我当前的解决方案是这样的。 它看起来很糟糕,我仍然认为有可能resolve() 例如,当gzReader中存在数据块时,将调用 谢谢 const inputStream = this.s3client.getObject(params).createReadStream() input
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)
})
}))
因为您从不初始化计数器,所以它是零,并且在前300ms之后,您的函数将解析(这可能是在管道工作并增加计数器之前) 所以不要使用
setInterval
;)你不需要它
如果您已经在mapSync中调用了异步函数,那么也不需要使用mapSync。只需使用map并传递数据和回调()。不要忘记在异步函数中调用回调
在管道中添加最后一步:等待(回调)
()您可以在这里解决。谢谢您的回答:)事实上,我在代码段开始之前初始化了计数器,这样它就可以工作了。解决办法似乎正在奏效。谢谢一个简单的问题是你不介意。不管怎样,如果我在内部调用异步函数,那么调用map或mapSync又有什么关系呢?@OhadBasan我会用干净的代码原则来回答你的问题:KISS(“保持简单,愚蠢”)。因此,不要使用箭头函数调用
map
或mapSync
,在箭头函数中调用另一个函数。只需将异步函数作为参数传递给map
。如下所示:.pipe(es.map(asyncFunc)).pipe…
和asyncFunc
具有类似asyncFunc(data)
的类型签名。PS:这只是示例代码;)