2015-04-17 86 views
0

我試圖從數據庫中提取庫存數據,循環每一行並獲取項目名稱。Javascript,處理foreach和回調

我還沒有使用回調shenanigans,這一直困擾着我。我如何循環所有項目,開始回調以獲取所有名稱,一旦一切就緒,請調用下一個函數?

我有一種感覺,它要麼非常接近我的設計,要麼我設計它的方式是不可能的。

Inventory.getPlayerInventory = function(playerId, next){ 
    Inventory 
     .find({playerId: playerId}) 
     .select('itemId quantity') 
     .exec(function getPlayerInventoryExec(err, inventories){ 
      _.each(inventories, function getPlayerInventoryEach(inventory, index){ 
       projectv.class.item.findById(inventory.itemId, function getPlayerInventoryFindById(err,item){ 
        inventories[index].itemName = item.itemName; 
       }) 
      }); 

      next(err, inventories); 
     }); 
}; 

回答

1

我認爲使用async會在這裏幫助你很多。嘗試是這樣的:

Inventory.getPlayerInventory = function(playerId, next){ 
Inventory 
    .find({playerId: playerId}) 
    .select('itemId quantity') 
    .exec(function getPlayerInventoryExec(err, inventories){ 
     async.eachSeries(inventories, function (inventory, each_done){ 
       projectv.class.item.findById(inventory.itemId, function getPlayerInventoryFindById(err,item){ 
       if (err) return each_done(err); 
       inventories[index].itemName = item.itemName; 
       each_done(); 
       }); 
     }, 
     function(err){ 
      // called after we're done iterating over the collection 
      next(err, inventories); 
     }); 
    }); 

這將確保每個findById()查詢將有時間在移動到下一個項目之前完成(通過調用each_done())。更多信息可在here