首页 > 解决方案 > 当其中任何一个失败时,如何停止创建承诺的循环?

问题描述

我正在尝试下载一些分成多个部分的文件,每个文件有 N 个介于 1 和 9999 之间的部分。我需要等待每个文件下载然后一起处理它们。

  const partsPromises = [];
  let finished = false;

  for (let i = 1; i < 10000 || finished; i++) {
    const part = String(i).padStart(5, '0'); // Part numbers are formated with 5 digits

    const prom = downloadPart(id, part); // Consider I'm given this id before this code by the user
    prom.catch(() => finished = true);
    /* This doesn't work as intended, I would like 
      for the first promise to fail to inmediately stop the loop */
    
    partsPromises.push(prom);
  }

  Promise.allSettled(videoPartsPromises).then(() => {
    // After all promises have settled I process the files
  });

function downloadPart(videoId, partNum) {
  return new Promise((resolve, reject) => {
    console.log(`Downloading part ${partNum}`);
    https.get(
      `PART URL`,
      (response) => {
        if (response.statusCode === 403) {
          reject();
          return;
        }

        const file = fs.createWriteStream(`${partNum}.file`);

        response.pipe(file);
        resolve();
      }
    );
  });
}

关于如何实现这种行为的任何想法?

标签: javascriptnode.js

解决方案


推荐阅读