2016-09-11 3 views
2

を完了するための非同期タスクを待っている、ここに私のコードは次のとおりです。の客室と対応するチャネルを取得するとき、私は、ユーザーが多くの部屋を持つことができ、各部屋には、多くのチャンネルを持つことができるアプリケーションを作成していnodejs

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

       }); 



      }); 
     } 

それは、

[ { 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) {})を待たないので、私は空の部屋のオブジェクトを持っているので、私は常に空の配列を取得し、次の構造を持つjavascriptオブジェクトを返すことが想定されます。どうすればこの問題を解決できますか?

+0

達成したいことを明確にします。私はあなたが "部屋のすべての部屋を取得し、部屋に割り当てられたすべてのチャンネルを更新する"と思っています。 –

+1

は約束のように聞こえる。 – sova

+0

@zabawareはい、まさに私が達成したいことです。 –

答えて

1

ループを完了した後で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); 
       }); 
      }); 
     } 
+0

あなたのソリューションを試しましたが、 'コールバックは既に呼び出されました'というエラーを返します。 –

+0

更新された回答 – abdulbarik

+0

残念ながら、私はまだ同じエラーが発生します - コールバックはすでに –

0

を、それが本当に約束のためのケースだった、私は非同期と組み合わせるブルーバード約束使用 - 変更されたコード:

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

      }); 
     } 

感謝を貢献したすべての人に。

関連する問題