Promise功能中的Promise:无法将数据推入Array

时间:2018-10-02 10:39:43

标签: javascript node.js promise sequelize.js

我正在使用sequelizeJS。我在Promise功能中有一个Promise。我想做一个Promise函数来获取数据,然后将这些数据推入Array并返回此Array。

我尝试使用此代码,但未成功。

function sequelize_conversation (conversation_id, req) {
  return new Promise((resolve, reject) => {
    var response = []
    for (let id of conversation_id) {
      db.ConversationPerson.findAll({ where: {'conversation_id': id, 'user_id': { [Op.ne]: req.user.user_id }} })
      .then(person => {
        console.log(person) // results: { 'id': 1, 'name': 'John' }
        response.push(person.dataValues)
      })
    }
    resolve(response)
  })
}

我得到的结果:

response = []

但是我想得到:

response = [{ 'id': 1, 'name': 'John' }]

请查看我的代码,并帮助我了解Promise功能中的Promise。预先谢谢你!

1 个答案:

答案 0 :(得分:1)

承诺隐含异步代码...您正在解决任何db.ConversationPerson.findAll都有机会做任何事情的情况,更不用说完成了

您的代码实际上比您想象的要简单

function sequelize_conversation (conversation_id, req) {
    var promises = [];
    for (let id of conversation_id) {
      promises.push(
        db.ConversationPerson.findAll({ where: {'conversation_id': id, 'user_id': { [Op.ne]: req.user.user_id }} })
        .then(data => {
          return data.dataValues
        })
      );
    }
    return Promise.all(promises);
}

或者,如果session_id是一个实际的数组,并添加一点ES6 +优点

const sequelize_conversation = (ids, req) => Promise.all(
    ids.map(conversation_id => 
        db.ConversationPerson.findAll({ 
            where: {
                conversation_id, 
                'user_id': { 
                    [Op.ne]: req.user.user_id 
                }
            }
        })
        .then(({dataValues}) => dataValues)
    )
);