Почему вместо значения получаю [Promise] из функции

Рейтинг: 0Ответов: 1Опубликовано: 29.04.2023

getUserGroups возвращает сгруппированных людей, getNumberByUserId возвращает некий secretNumber по id, на выходе нужно получить функцию getUsers, возвращающую массив юзеров такого вида:

[ { id: 3, name: 'Alex', secretNumber: 9 } ]
const getUserGroups = () => {
    const userGroups = [
        {
            id: 1,
            name: 'Друзья',
            users: [
                { id: 1, name: 'Anna' },
                { id: 3, name: 'Bob' },
                { id: 4, name: 'V' },
            ],
        },
        {
            id: 2,
            name: 'Коллеги',
            users: [
                { id: 7, name: 'Alex' },
                { id: 10, name: 'Max' },
                { id: 11, name: 'X' },
                { id: 14, name: 'Steve' },
                { id: 77, name: 'Lisa' },
                { id: 78, name: 'Mike' },
                { id: 81, name: 'Sam' },
                { id: 89, name: 'John' },
            ],
        },
    ];

    return new Promise((resolve) => {
        setTimeout(() => resolve(userGroups), 300);
    });
};

const getNumberByUserId = (id) => {
    return new Promise((resolve) => {
        setTimeout(() => resolve(id ** 2), 3000);
    });
};
const getUsers = async (group) => {
    const promises = group.users.map(async (el) => {
        const secretNumber = getNumberByUserId(el.id);
        return { id: el.id, name: el.name, secretNumber };
    });
    return (await Promise.all(promises)).filter((el) => el.secretNumber % 2 != 0);
}
(async () => {
    const groups = await getUserGroups();
    const results = await Promise.all(groups.map((group) => getUsers(group)))
    console.log(results)
})();

У меня приходит массив вида:

[ { id: 7, name: 'Alex', secretNumber: [Promise] } ]

Ответы

▲ 0Принят

Вы не дожидаетесь разрешения промиса из функции getNumberByUserId, поэтому получаете некорректный ответ.

Добавьте await перед вызовом функции getNumberByUserId и все заработает

const getUsers = async (group) => {
  const promises = group.users.map(async (el) => {
    const secretNumber = await getNumberByUserId(el.id);
    return { id: el.id, name: el.name, secretNumber };
  });
  return (await Promise.all(promises)).filter((el) => el.secretNumber % 2 !== 0);
}