Обновите старую функцию до async await

#javascript #node.js #async-await #sequelize.js

#javascript #node.js #async-await #sequelize.js

Вопрос:

Я хочу обновить эту функцию до async, но не могу заставить объект users, который отображается из объекта interactions, возвращать данные в том же формате, и мои значения в асинхронной функции отображаются на стороне клиента с нулевым значением. В консоли я получаю только объект Promise и undefined.

Это мой рабочий код:

 Interaction.findAll({
    where: {
        targetUserId: fbId,
        status: 'invited'
    }, 
    order: [['createdAt', 'DESC']]
}).then(function (interactions) {
    Promise.all(interactions.map(interaction =>
        User.findOne({
             where: {
                 facebookUserId: interaction.userId
             },
             attributes: ['firstName', 'facebookUserId', 'pictureUrl']
    }))).then(function (users) {
    res.status(200).send(users.map(user => user.dataValues));
    })
},
  

Это то, что у меня есть до сих пор, но мои данные не возвращаются клиенту в том же формате:

 try {
    const interactions = await Interaction.findAll({
        where: {
            targetUserId: userId,
            status: 'invited'
        },
        attributes: ['lastReplyAt', 'seen', 'userId'],
    })

    const users = await interactions.map(interaction => User.findOne({
        where: {
            facebookUserId: interaction.userId
        },
        attributes: ['firstName', 'facebookUserId', 'pictureUrl'],
    }))
    res.status(200).send(users.map(user => user.dataValues));
}
catch (error) {
    console.log(error);
    res.status(500).send(error);
}
  

Если я возвращаю только объект users, ошибка более конкретна и говорит, что ‘FirstName’ равно нулю. Возврат отображаемого пользователем объекта выдает мне ключевую ошибку.

Комментарии:

1. interactions.map() по-прежнему возвращает массив, поэтому вам все равно нужно Promise.all() получить обещание, которое вы можете ожидать.

2. Так просто! Я люблю тебя!! @MarkMeyer Большое вам спасибо!

3. await работает только тогда, когда выражение после него возвращает обещание. вызов map возвращает массив и, следовательно, работает не так, как вы хотите. На самом деле вы не можете заменить обещание. все с одним ожиданием. Ваш код должен выглядеть больше как await Promise.all(fn.map( ... ))

Ответ №1:

Попробуйте это:

 interaction = await Interaction.findAll({
    where: {
        targetUserId: fbId,
        status: 'invited'
    }, 
    order: [['createdAt', 'DESC']]
})

users = await Promise.all(interactions.map(interaction => {
  User.findOne({
  where: {
    facebookUserId: interaction.userId
  },
  attributes: ['firstName', 'facebookUserId', 'pictureUrl']})
})

res.status(200).send(users.map(user => user.dataValues));
  

Комментарии:

1. Большое вам спасибо, что нашли время ответить. Много добрых пожеланий вам.