forEach не ждёт async-callbacks, поэтому loadUsers возвращает массив до завершения запросов; используйте Promise.all с map или последовательный цикл.
async function loadUsers(ids) {
forEach не ждёт async-callbacks, поэтому loadUsers возвращает массив до завершения запросов; используйте Promise.all с map или последовательный цикл.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
async function loadUsers(ids) {
const users = []
ids.forEach(async id => {
const res = await fetch(/api/users/${id})
const user = await res.json()
users.push(user)
})
return users
}
Identify the problem with this code and suggest how to fix it.
Ответ
forEach не ждёт async-callbacks, поэтому loadUsers возвращает массив до завершения запросов; используйте Promise.all с map или последовательный цикл.
Параллельный вариант сохраняет порядок ids и явно проверяет HTTP-статус:
async function loadUsers(ids) {
return Promise.all(ids.map(async id => {
const res = await fetch(`/api/users/${encodeURIComponent(id)}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}));
}
Для большого списка ограничьте параллелизм. Promise.all отклоняется при одной ошибке, но сам не отменяет остальные fetch.