javascript - 当其中任何一个失败时,如何停止创建承诺的循环?
问题描述
我正在尝试下载一些分成多个部分的文件,每个文件有 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();
}
);
});
}
关于如何实现这种行为的任何想法?
解决方案
推荐阅读
- r - 使用 R 中的“workflwr”包创建 git 存储库的 create_gh_repo”错误
- javascript - Angular - 只打印了几个变量,有什么奥秘?
- c++ - 引用已删除的析构函数
- node.js - 为什么我的电脑访问yarn和npm注册网站,远程地址是本地的?
- npm - Azure 数据工厂 自动发布以实现持续集成和交付
- c# - 用于javascript调试的visual studio 2019 Edge浏览器停在错误的行
- python - Mac 终端有什么方法可以同时运行 npm start 和 flask run 吗?
- mirth - Mirth Connect 在更改服务器时发送旧消息
- c# - 在 asp.net 中使用 jquery 级联下拉到自动完成文本框
- node.js - 两个日期之间的天数 - 打字稿