Я хочу добавить тайм-аут, чтобы, если какая-либо из этих «задач» занимала более 5 минут, она должна была остановить эту функцию и выполнить обещание. Я немного боролся, любая помощь приветствуется. Спасибо!
if (require.main === module) {
(async () => {
const tasks = [];
for (let i = 1; i <= NB_PARALLEL; i++) {
tasks.push(buildReferenceSpaceCollection(json));
}
const results = await Promise.all(tasks);
console.info(results);
process.exit(0);
})().catch(console.error);
}
Вы можете определить wait
-функцию, которая отклоняется через заданное время, а затем использовать Promise.race
для этой wait
-функции и вашей Promise.all
. Теперь, если ваши обещания внутри Promise.all
занимают больше времени, чем wait
, Promise.race
будет отклонено, иначе разрешенные значения будут присвоены results
.
function wait(ms) {
return new Promise((_, reject) => {
setTimeout(() => {
reject(new Error("wait time exceeded"));
}, ms);
})
}
(async () => {
const tasks = [];
for (let i = 1; i <= NB_PARALLEL; i++) {
tasks.push(buildReferenceSpaceCollection(json));
}
// 5 mins in ms
const wait5MinPromise = wait(5*60*1000);
const results = await Promise.race([wait5MinPromise, Promise.all(tasks)]);
console.info(results);
process.exit(0);
})().catch(console.error)
;
Рад помочь, пожалуйста, не забудьте принять ответ, нажав на галочку слева, спасибо :)
Просто для удовольствия (Живая демонстрация):
import { CPromise } from "c-promise2";
const generateYourAsyncTaskHereToAddInQueue= async (value)=> {
console.info(`Inner task started [${value}]`);
await CPromise.delay(1000);
return value;
}
(async () => {
const results = await CPromise.all(function* () {
for (let i = 0; i < 10; i++) {
yield generateYourAsyncTaskHereToAddInQueue(`Task result ${i}`);
}
}, {concurrency: 3}).timeout(5000);
console.info(`results:`, results);
return results;
})().catch(console.error);
Большое спасибо!!