Node.js:for..of使用管道不等待完成

时间:2020-07-03 14:44:15

标签: javascript node.js pipeline fs

我正在使用带管道的for..of循环,但是即使在管道完成执行之前,也会执行循环后的语句,即使我在管道中添加了等待,也会发生这种情况

这是我的相关代码

   for(const m of metadata) {
    if(m.path) {
      let dir = `tmp/exports/${exportId}/csv_files_tranformed/${m.type}`;
      let fname = `${dir}/${m.sname}`;
      fs.mkdirSync(dir,{recursive: true}, (err) => {
        if(err) throw err;
      });
      tempm = m;
      await pipeline(
        fs.createReadStream(m.path),
        csv.parse({delimiter: '\t', columns: true}),
        csv.transform((input) => {
            return input;
        }),
        csv.stringify({header: true, delimiter: '\t'}),
        fs.createWriteStream(fname, {encoding: 'utf16le'}),
        (err) => {
          if (err) {
            console.error('Pipeline failed.', err);
          } else {
            console.log('Pipeline succeeded.');
          }
        }
      )
    }
  }

在移至下一条语句之前,如何确保管道已完全完成。

谢谢。

1 个答案:

答案 0 :(得分:1)

您应提供pipeline函数的来源。它可能是第三方库,也可能来自节点的stream

如果它是stream.pipeline而不是返回流,那么await pipeline(...将不会等待,因为它不是Promise。您可以使用实用程序Reference

将流转换为Promise
const util = require('util');
const { pipeline } = require('stream');
const pipelinePromise = util.promisify(pipeline);

// ...
await pipelinePromise();
相关问题