ストリームのパイピングが完了するまで待つ方法は? (Nodejs) 質問する

ストリームのパイピングが完了するまで待つ方法は? (Nodejs) 質問する

私は Promise の for ループ配列を持っているので、Promise.all を使用してそれらを調べ、その後 then を呼び出しました。

let promises = [];
promises.push(promise1);
promises.push(promise2);
promises.push(promise3);

Promise.all(promises).then((responses) => {
  for (let i = 0; i < promises.length; i++) {
    if (promise.property === something) {
      //do something
    } else {
      let file = fs.createWriteStream('./hello.pdf');
      let stream = responses[i].pipe(file);
      /*
         I WANT THE PIPING AND THE FOLLOWING CODE 
         TO RUN BEFORE NEXT ITERATION OF FOR LOOP
      */
      stream.on('finish', () => {
        //extract the text out of the pdf
        extract(filePath, {splitPages: false}, (err, text) => {
        if (err) {
          console.log(err);
        } else {
          arrayOfDocuments[i].text_contents = text;
        }
      });
    });    
  }
}

promise1、promise2、promise3 は http リクエストであり、そのうちの 1 つが application/pdf である場合は、それをストリームに書き込み、そこからテキストを解析します。ただし、このコードは、pdf からテストを解析する前に次の反復を実行します。ストリームへのパイプ処理と抽出が完了するまでコードを待機させてから、次の反復に進む方法はありますか?

ベストアンサー1

async/await がないと、かなり厄介です。async/await を使用する場合は、次のようにします。

Promise.all(promises).then(async (responses) => {
  for (...) {
    await new Promise(resolve => stream.on("finish", resolve));
    //extract the text out of the PDF
  }
})

おすすめ記事