#Sequelize findAll events和forEach event getUser

时间:2015-07-28 18:50:39

标签: javascript promise sequelize.js findall

我在Sequelize和承诺方面遇到了一些问题(主要是承诺)。 示例: 我想要我所有的活动和这个活动的主人。我做过类似的事情:

 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中检索我的字符串

1 个答案:

答案 0 :(得分:7)

event.getUsers返回一个承诺 - 所以你分配events.dataValues.master(这是数组,而不是btw的特定事件)承诺,而不是值。

此外,在next完成之前,您将返回getUsers,因为它们发生异步

这样的事情应该有效

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中返回对回调的承诺时,在所有返回的承诺完成之前(即在所有{{1}之前),不会调用then(调用next)调用已完成。 我还更改了where子句以使用对象而不是字符串:)

但是等等!我们可以做得更好!

getUsers

这个左边连接关系为master的users表。您可能希望在models.events.findAll({ include: [ { model: User, through: { where: { relation: 'master' } } } ] }).then(function(events) { return next(events); }).catch(function(err) {next(err);}); 中制作地图,因为用户将被置于then下,而不是.users