我试图从数据库中提取库存数据,循环每一行并获取项目名称。
我还没有用来回叫恶作剧,这让我很难过。如何循环所有项目,启动回调以获取所有名称,一旦一切准备就绪,调用下一个函数?
我感觉它与我所拥有的非常接近,或者我设计它的方式是不可能的。
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);
});
};
答案 0 :(得分: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。