Функция «Обещание в обещании»: невозможно передать данные в массив - PullRequest
0 голосов
/ 02 октября 2018

Я использую sequelizeJS.У меня есть функция Обещание в Обещании.Я хочу создать функцию Promise для получения данных, затем поместить эти данные в массив и вернуть этот массив.

Я пытался использовать этот код, но он не увенчался успехом.

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 in Promise,Заранее спасибо!

1 Ответ

0 голосов
/ 02 октября 2018

обещания подразумевают асинхронный код ... вы решаете, прежде чем любой из 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);
}

Или, если разговор_ид фактический массив, и добавление немного 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)
    )
);
...