Answer

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));

Report Page