Answer
t.me/js_testОтвет:
[{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }]
Объяснение:
Пойдём по порядку, функция fetchPostById принимает id и возвращает промис который зарезолвится через случайное время(от 10 до 100 миллисекунд). Функция fetchAllPosts принимает массив айдишников и тоже возвращает промис потому что в качестве коллбэка в метод reduce мы передаём асинхронную функцию. Внутри этого самого reduce и происходит всё непотребство, во-первых мы каждый раз дожидаемся выполнения аккумулятора?! и во-вторых в качестве первого значения аккумулятора мы передаём промис. Объясняется это всё тем что мы передаём именно асинхронную функцию в качестве колбэка и именно поэтому аккумулятор каждый раз становится промисом но в первый раз нам это нужно явно указать.
Код:
const fetchPostById = async (id) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ id });
}, Math.floor(10 + Math.random() * 100));
});
};
const fetchAllPosts = async (ids) => {
return await ids.reduce(async (prev, id) => {
const acc = await prev;
const post = await fetchPostById(id);
return acc.concat(post);
}, Promise.resolve([]));
};
fetchAllPosts([0, 1, 2, 3, 4, 5, 6])
.then((value) => console.log(value));