如何在Node.js中添加promise.all在循环中searchfindOrCreate?

我在续集中创build了两个模型。 我得到了一系列的结果“用户”,并通过循环来获取或创build新的“房间”基于User.id。 我想打印完所有的房间。 我在控制台中得到了空数组,因为它是不同步的。 如何在创build所有房间后调用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) }); 

你可以通过Promise.all来执行promise的数组:

 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); }); 

尝试把console.log放在.then函数中。 将它链接起来。 我相信一组房间将作为parameter passing给第一个callback:

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

要么,

你可以尝试重构你的代码,并把你的逻辑放在一个.then函数中。

 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 }) ); } });