Javascript 如何在Node.js中添加promise.all Sequelize findOrCreate in循环?

Javascript 如何在Node.js中添加promise.all Sequelize findOrCreate in循环?,javascript,node.js,promise,sequelize.js,Javascript,Node.js,Promise,Sequelize.js,我在sequelize中创建了两个模型。我得到了一组结果“Users”,然后根据User.id循环获取或创建新的“Room”。我想把所有的房间都打印出来。我在控制台中得到了空数组,因为它是异步的。创建所有文件室后如何调用console.log var Users = sequelize.import(__dirname + "/../models/own/user"); var Rooms = sequelize.import(__dirname + "/../models/own/room")

我在sequelize中创建了两个模型。我得到了一组结果“Users”,然后根据User.id循环获取或创建新的“Room”。我想把所有的房间都打印出来。我在控制台中得到了空数组,因为它是异步的。创建所有文件室后如何调用console.log

var Users = sequelize.import(__dirname + "/../models/own/user");
var Rooms = sequelize.import(__dirname + "/../models/own/room");    
var _this = this;

this.users = [];
this.rooms = [];

Users.findAll().then(function(users) {
    _this.users = users;

    users.forEach(function(user){

        Rooms.findOrCreate({where: {user_id: user.get('id')}})
        .spread(function(room, created) {
          _this.rooms.push(
            room.get({
              plain: true
            })
          );

        });

    });

    console.log(_this.rooms)

});

尝试将
控制台.log
放在
中,然后运行
功能。把它拴起来,散开。我相信一组房间将作为参数传递给第一个回调:

.then(function(rooms){
    ...
})
或者

您可以尝试重构代码并将逻辑放入
。然后
函数中

Rooms.findOrCreate({where: {user_id: user.get('id')}})
.then(function(rooms, created) {
    var room;

    for(var i in rooms){
        room = rooms[i];

        _this.rooms.push(
            room.get({
                plain: true
            })
        );
    }
});

您可以通过Promise.all执行承诺数组:

var promises = users.map(function(user){
    return Rooms.findOrCreate({where: {user_id: user.get('id')}});
});
Promise.all(promises).then(function(dbRooms){
    for(var key in dbRooms){
        _this.rooms.push(dbRooms[key][0].get({plain: true}));
    }
    console.log(_this.rooms);
});

然后的链条就不起作用了。然后在循环中的每次排列执行时执行。我需要在forEachPrefer
map
to
forEach
的所有迭代之后执行一次sth。在这种情况下,使用lambda它是
const rooms=Promise.all(users.map(user=>rooms.findOrCreate({where:{user\u id:user.get('id')}));房间。然后(…)