Javascript,处理foreach和回调

时间:2015-04-17 01:06:34

标签: javascript callback mongoose

我试图从数据库中提取库存数据,循环每一行并获取项目名称。

我还没有用来回叫恶作剧,这让我很难过。如何循环所有项目,启动回调以获取所有名称,一旦一切准备就绪,调用下一个函数?

我感觉它与我所拥有的非常接近,或者我设计它的方式是不可能的。

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 个答案:

答案 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