【问题标题】:Javascript, dealing with foreach and callbackJavascript,处理 foreach 和回调
【发布时间】:2015-06-23 16:10:09
【问题描述】:

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

我还不习惯回调恶作剧,这让我很困惑。如何循环所有项目,启动回调以获取所有名称,一旦一切就绪,调用下一个函数?

我有一种感觉,要么真的很接近我所拥有的,要么不可能按照我的设计方式。

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);
        });
};

【问题讨论】:

    标签: javascript callback mongoose


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 2016-12-13
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多