等待asynchronous任务完成nodejs

我正在创build一个应用程序,用户可以有很多房间,每个房间可以有很多频道,这是我的代码时,检索房间和相应的渠道:

getRooms: function (req, res) { User.find({id: req.cookies.claver_id}).exec(function (err, result) { if (err) { return res.send(400); } rooms = result[0].rooms; if (rooms.length === 1) {//No room defaults to [''] return res.send(400); } var roomsObj = {}; var roomsArr = [];//we will place the roomsObj inside the roomsArr var chansObj = {}; var chansArr = []; async.each(rooms, function (roomId, cb){ roomsObj = {}; if (roomId !== '') { Rooms.findOne({id: roomId}).exec(function (err, room){ roomName = room.name; inviteLink = room.inviteLink; roomsObj.name = roomName; roomsObj.id = roomId; roomsObj.inviteLink = inviteLink; var channels = room.channels; async.each(channels, function (channelId, cb) { chansObj = {}; Channels.findOne({id: channelId}).exec(function (err, channel){ chansObj.name = channel.channelName; chansObj.id = channelId; chansObj.type = channel.channelType; chansArr.push(chansObj); cb(); }); }, function (err) { }); }); } cb(); }, function (err) { roomsObj.channels = chansArr; roomsArr.push(roomsObj); sails.log(roomsArr); }); }); } 

这是假设返回一个JavaScript对象的结构如下:

 [ { name: "Room Name", roomId: "Room Id", inviteLink: "Room Invite Link", channels: [ { name: "Channel Name", id: "channel Id" } ] } ] 

但我总是得到一个空数组,因为async.each(rooms, function (roomId, cb){ })不会等待async.each(channels, function (channelId, cb) {})来完成,所以我有空的空间目的。 请问我该如何解决这个问题?

完成channels循环后,您应该拨打您rooms's callback循环。

你应该这样做:

 getRooms: function (req, res) { User.find({id: req.cookies.claver_id}).exec(function (err, result) { if (err) { return res.send(400); } rooms = result[0].rooms; if (rooms.length === 1) {//No room defaults to [''] return res.send(400); } var roomsObj = {}; var roomsArr = [];//we will place the roomsObj inside the roomsArr var chansObj = {}; var chansArr = []; async.each(rooms, function (roomId, callback1){ roomsObj = {}; if (roomId !== '') { Rooms.findOne({id: roomId}).exec(function (err, room){ roomName = room.name; inviteLink = room.inviteLink; roomsObj.name = roomName; roomsObj.id = roomId; roomsObj.inviteLink = inviteLink; var channels = room.channels; var i=0; async.each(channels, function (channelId, callback2) { chansObj = {}; Channels.findOne({id: channelId}).exec(function (err, channel){ chansObj.name = channel.channelName; chansObj.id = channelId; chansObj.type = channel.channelType; chansArr.push(chansObj); i++; if(i===(channels.length-1)){ i=0; callback1(); }else{ callback2(); } }); }, function (err) { }); }); } }, function (err) { roomsObj.channels = chansArr; roomsArr.push(roomsObj); sails.log(roomsArr); }); }); } 

我解决了它,这确实是一个承诺的情况下,我用蓝鸟诺言结合asynchronous – 修改后的代码:

 getRooms: function (req, res) { User.find({id: req.cookies.claver_id}).exec(function (err, result) { if (err) { return res.send(400); } rooms = result[0].rooms; if (rooms.length === 1) {//No room defaults to [''] return res.send(400); } var roomsObj = {}; var roomsArr = [];//we will place the roomsObj inside the roomsArr var chansObj = {}; var chansArr = []; Promise.each(rooms, function (roomId, callback1){ roomsObj = {}; if (roomId !== '') { async.series ([ function () { Rooms.findOne({id: roomId}).then(function (room){ roomName = room.name; inviteLink = room.inviteLink; roomsObj.name = roomName; roomsObj.id = roomId; roomsObj.inviteLink = inviteLink; channels = room.channels; sails.log(roomName); }) } ]); return Promise.each(channels, function (channelId) { return Promise.all([ Channels.findOne({id: channelId}).then(function (channel){ chansObj = {}; chansObj.name = channel.channelName; chansObj.id = channelId; chansObj.type = channel.channelType; chansArr.push(chansObj); sails.log(chansObj); }) ]).then(function () { sails.log('done one'); }); }).then(function () { roomsObj.channels = chansArr; roomsArr.push(roomsObj); sails.log('done all'); chansArr = []; }); } }).then(function () { sails.log(roomsArr); sails.log("grand finish"); }); }); } 

感谢大家的贡献。