Проблема в том, что ваша функция registerTask
помещает функции в массив tasks
, а не Promise
объекты. Если вы измените функцию следующим образом, она должна работать:
const registerTask = (name, task) => {
const asyncFunc = async () => {
return { [name]: await task() };
};
tasks.push( asyncFunc() ); // This pushes a promise into 'tasks'
};
В результате ваш оригинальный код tasks
стал массивом функций, которые еще не были вызваны. Когда вы вызываете Promise.all(tasks)
, он немедленно заканчивается undefined
для каждой записи в массиве, поскольку не было Promise
объектов, ожидающих ожидания.
Что касается обработки ошибок, Promise.all
завершится с ошибкой первое отклонение или исключение, которое случается. Если вы хотите обработать отдельный случай ошибки каждой задачи, то вы должны сделать это в Promise
, созданном в registerTask
, поскольку делать это во время Promise.all
слишком поздно. Трудно привести пример, так как я не уверен, какой тип обработки ошибок подходит для задач, но, возможно, что-то вроде этого:
const registerTask = (name, task) => {
const asyncFunc = async () => {
return { [name]: await task() };
};
const promise = asyncFunc()
.catch(err => {
return handleError(name, err);
});
tasks.push( promise );
};
function handleError(name, err) {
console.log(`Task ${name} had error ${err}`);
// don't re-throw the error if you want all tasks to complete
// return some error object so you can see which tasks failed after they're done
return {error: err, name: name};
}