簡體   English   中英

如何在Node.js中添加promise.all在循環中順序化findOrCreate?

[英]How to add promise.all in Node.js Sequelize findOrCreate in loop?

我在續集中創建了兩個模型。 我得到了結果“ 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)

});

您可以通過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);
});

嘗試將console.log放在.then函數中。 .spread之后將其鏈接。 相信房間的數組將作為參數傳遞給第一個回調:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM