Javascript,处理foreach和回调
Javascript, dealing with foreach and callback
我正在尝试从数据库中提取库存数据,循环每一行并获取项目名称。
我还不习惯回电恶作剧,这让我很困惑。我如何循环所有项目,启动回调以获取所有名称,并在一切准备就绪后调用下一个函数?
我感觉它要么非常接近我所拥有的,要么与我设计的方式完全不同。
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);
});
};
我认为使用 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。
我正在尝试从数据库中提取库存数据,循环每一行并获取项目名称。
我还不习惯回电恶作剧,这让我很困惑。我如何循环所有项目,启动回调以获取所有名称,并在一切准备就绪后调用下一个函数?
我感觉它要么非常接近我所拥有的,要么与我设计的方式完全不同。
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);
});
};
我认为使用 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。