Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何判断带有管道的溪流何时完成排水_Javascript_Node.js - Fatal编程技术网

Javascript 如何判断带有管道的溪流何时完成排水

Javascript 如何判断带有管道的溪流何时完成排水,javascript,node.js,Javascript,Node.js,我有一条由一连串管子组成的小溪。 我正在使用包创建管道的构建块。 代码从S3获取一个文件,解压它,解析它并将数据发送给某个异步函数 我正在努力让承诺在处理完那个文件后得到解决。 我怎样才能确保链条上的水已经排完? 我当前的解决方案是这样的。 它看起来很糟糕,我仍然认为有可能resolve() 例如,当gzReader中存在数据块时,将调用 谢谢 const inputStream = this.s3client.getObject(params).createReadStream() input

我有一条由一连串管子组成的小溪。 我正在使用包创建管道的构建块。 代码从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)
      })
  }))

因为您从不初始化计数器,所以它是零,并且在前300ms之后,您的函数将解析(这可能是在管道工作并增加计数器之前)

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

如果您已经在mapSync中调用了异步函数,那么也不需要使用mapSync。只需使用map并传递数据和回调()。不要忘记在异步函数中调用回调

在管道中添加最后一步:
等待(回调)
()

您可以在这里解决。

谢谢您的回答:)事实上,我在代码段开始之前初始化了计数器,这样它就可以工作了。解决办法似乎正在奏效。谢谢一个简单的问题是你不介意。不管怎样,如果我在内部调用异步函数,那么调用map或mapSync又有什么关系呢?@OhadBasan我会用干净的代码原则来回答你的问题:KISS(“保持简单,愚蠢”)。因此,不要使用箭头函数调用
map
mapSync
,在箭头函数中调用另一个函数。只需将异步函数作为参数传递给
map
。如下所示:
.pipe(es.map(asyncFunc)).pipe…
asyncFunc
具有类似
asyncFunc(data)
的类型签名。PS:这只是示例代码;)