如何在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 }) ); } });