如何判断管道流完成排水的时间

时间:2018-02-27 14:11:45

标签: javascript node.js

我有一个由一系列管道组成的流。 我正在使用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)
      })
  }))

1 个答案:

答案 0 :(得分:2)

因为你永远不会初始化计数器,所以它是零,在前300ms之后,你的函数会解析(可以在你的管道工作之前增加计数器)。

所以不要使用setInterval;)你不需要它。

如果您已经在其中调用异步函数,则无需使用mapSync。只需使用map并传递数据和回调(https://github.com/dominictarr/event-stream#map-asyncfunction)。不要忘记在异步功能中调用回调!

在管道中添加最后一步:wait(callback)https://github.com/dominictarr/event-stream#wait-callback
在那里你可以解决。