Я пытаюсь создать загрузчик, который автоматически повторяет загрузку. В основном, очередь задач, которая повторяет задачи определенное количество раз. Сначала я попытался использовать Promise.all()
, но «хитрость» для обхода отказа при первом отклонении , описанная здесь , не помогла (и является анти-паттерном, как описано далее в этом потоке)
Итак, у меня есть работающая версия, которая, кажется, делает то, что я хочу. По крайней мере, результаты, которые он печатает, верны. Но все равно выдается несколько uncaught exception test X
ошибок / предупреждений, и я не знаю, что с этим делать.
Код:
asd = async () => {
// Function simulating tasks which might fail.
function wait(ms, data) {
return new Promise( (resolve, reject) => setTimeout(() => {
if (Math.random() > 0.5){
resolve(data);
} else {
reject(data);
}
}, ms) );
}
let tasks = [];
const results = [];
// start the tasks
for ( let i = 0; i < 20; i++) {
const prom = wait(100 * i, 'test ' + i);
tasks.push([i, prom]);
}
// collect results and handle retries.
for ( let tries = 0; tries < 10; tries++){
failedTasks = [];
for ( let i = 0; i < tasks.length; i++) {
const task_idx = tasks[i][0];
// Wait for the task and check whether they failed or not.
// Any pointers on how to improve the readability of the next 6 lines appreciated.
await tasks[i][1].then(result => {
results.push([task_idx, result])
}).catch(err => {
const prom = wait(100 * task_idx, 'test ' + task_idx);
failedTasks.push([task_idx, prom])
});
}
// Retry the tasks which failed.
if (failedTasks.length === 0){
break;
} else {
tasks = failedTasks;
}
console.log('try ', tries);
}
console.log(results);
}
В конце концов, массив results
содержит (если не выполнить задачу 10 раз) все результаты. Но все же uncaught exceptions
летают вокруг.
Поскольку не все отклоненные обещания приводят к неперехваченным исключениям, я подозреваю, что запуск задач сначала, а применение then()/catch()
позже вызывает некоторые проблемы с синхронизацией.
Любые улучшения или лучшие решения моих проблем приветствуются. Например. мое решение позволяет повторять попытки только "волнами". Если кто-нибудь придумает лучшее непрерывное решение, это также будет высоко оценено.