2015-07-28 3 views
1

У меня возникли проблемы с Sequelize и обещанием (в основном с обещанием). Пример: Я хочу, чтобы все мои События и хозяин этих событий. Я сделал что-то вроде этого:#Sequelize findВсе события и для каждого события getUser

models.events.findAll().then(function(event) { 
    events.forEach(function(event){ 
     events.dataValues.master = event.getUsers({ 
       where: ['UserRelationEvent.relation = "master"'], 
       joinTableAttributes: [] 
     }).then(function(user){ 
       return user[0].dataValues; 
     }); 
    }); 
    return next(events); 
}).catch(function(err) {next(err)}); 

Но я получил Sequelize объект .. Я проверил мое содержание в user[0].dataValues Это именно то, что я хочу .. так что я думаю, что я что-то пропустил и не понял что-то с обещаниями:/ стараюсь много вещей, но в основном мой вопрос: как я могу получить мои строки из моего console.log

ответ

5

event.getUsers возвращает обещание - так что вы назначаете events.dataValues.master (который является массивом, а не конкретное событие кстати) обещание , а не значение.

Кроме того, вы возвращаете next до будет сделано, потому что они происходят асинхронной

Что-то, как это должно работать

models.events.findAll().then(function(events) { 
    sequelize.Promise.each(events, function(event){ 
     return event.getUsers({ 
       through: { 
        where: { relation: 'master' } 
       }, 
       joinTableAttributes: [] 
     }).then(function(user){ 
       event.dataValues.master = user[0]; 
     }); 
    }).then(function (events) { 
     return next(events); 
    }); 
}).catch(function(err) {next(err);}); 

При возврате обещание обратного вызова в promise.each, то then (который вызывает next) не вызывается, прежде чем все возвращенные обещания будут выполнены (т. Е. До завершения всех вызовов. Я также изменил предложение where, чтобы использовать объект вместо строки :)

Но подождите! Мы можем сделать лучше!

models.events.findAll({ 
    include: [ 
     { 
      model: User, 
      through: { 
       where: { 
        relation: 'master' 
       } 
      } 
     } 
    ] 
}).then(function(events) { 
    return next(events); 
}).catch(function(err) {next(err);}); 

Это левое присоединение к таблице пользователей, где отношение является основным. Вы можете сделать карту в then, поскольку пользователи будут помещены под .users, а не .master

Смежные вопросы