Вызывайте функции по одной в цикле с await и ловите ошибку каждой отдельно, чтобы продолжить после отклонения. Передавать нужно функции, а не уже запущенные промисы.
Последовательный запуск асинхронных функций
Вызывайте функции по одной в цикле с await и ловите ошибку каждой отдельно, чтобы продолжить после отклонения. Передавать нужно функции, а не уже запущенные промисы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите функцию, принимающую массив функций, каждая из которых возвращает промис, и обеспечьте их последовательное выполнение – следующая функция должна запускаться только после того, как предыдущий промис будет разрешён (или отклонён).
Ответ
Вызывайте функции по одной в цикле с await и ловите ошибку каждой отдельно, чтобы продолжить после отклонения. Передавать нужно функции, а не уже запущенные промисы.
async function runSequentially(tasks) {
const results = [];
for (const task of tasks) {
try { results.push({ status: 'fulfilled', value: await task() }); }
catch (reason) { results.push({ status: 'rejected', reason }); }
}
return results;
}
Следующая операция начинается после завершения предыдущей в любом состоянии. Результаты возвращаются в формате, похожем на allSettled. Синхронное исключение task тоже перехватывается. Если требуется остановка при первой ошибке, уберите локальный catch; это другой контракт, не заданный здесь.