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