2017-06-06 83 views
0

我正在使用firebase和Node.js構建應用程序。我需要從嵌套的foreach獲取數據。如何正確地做到這一點?需要同時返回所有迭代的結果。從嵌套的foreach獲取數據

exports.userParty = function (userInfo, cb) { 

var userID = userInfo.userID; 
var clubID = userInfo.clubID; 

var refUserParty = ref.child(userID).child('my_party_id'); 

var party = {}; 

refUserParty.orderByValue().once("value", function (snapshot) { 

    var party = {}; 

    snapshot.forEach(function (partyID) { 

     var refParty = dbb.ref('clubs').child(clubID).child('party').child(partyID.val()); 

     refParty.once('value', function (partyBody) { 
      party[partyID.val()] = partyBody.val(); 
      //console.log(party); 
     }); 

    }); 
    cb(party); // {} 

}); 

}; 
+0

您想做什麼?使用'refParty.once(...'block)中的'partyBody'對象調用回調函數? – dan

+0

如果是這樣,您應該將'cb(party)'移動到當前擁有'//console.log(派對) )' – dan

+0

在這種情況下,我只得到第一次迭代的結果,我需要同時返回所有迭代的結果 –

回答

1

你需要調用回調在forEach塊中的所有異步函數完成後。您可以使用一個簡單的計數器來檢查所有異步功能是否完整:

... 

let completedSnapshots = 0; 

snapshot.forEach(function (partyID) { 

    var refParty = dbb.ref('clubs').child(clubID).child('party').child(partyID.val()); 

    refParty.once('value', function (partyBody) { 
     party[partyID.val()] = partyBody.val(); 
     completedSnapshots++; 
     if (completedSnapshots === snapshot.val().length) { 
      cb(party); 
     } 
    }); 

}); 

...