【问题标题】:How to implement Async with Mongoose method如何使用 Mongoose 方法实现异步
【发布时间】:2023-03-25 11:13:01
【问题描述】:

我现在有以下代码:

exports.listByUser = function(req, res) {
    Attack.find({user: req.user._id}, function(err, attacks) {
        if(err) 
            return next(err);
        for(var i in attacks) {
            attacks[i].evaluateFight();
        }
        res.json(attacks);
    });
};

主要问题是attacks[i].evaluateFight()被异步调用,我想对其进行改造以确保完成[i-1]迭代......最后调用res.json(attacks)。我认为,它可以用async 完成,但我不知道如何:( 这样的东西应该可以工作,但我怎么能打电话给attacks.method

async.eachSeries(attacks, function (callback) {
  //something??
  callback();
}, function (err) {
  if (err) { throw err; }
  res.json(attacks);
});

【问题讨论】:

    标签: node.js asynchronous mongoose


    【解决方案1】:

    您可以利用 async whilst 方法调用来实现相同的功能。但是,我对evaluateFight 的回调有疑问,因为如果它是异步执行的,那么必须有一些与之关联的回调,它将通知上一次调用是否成功。

    示例代码可以如下假设evaluateFight在完成时返回一个回调 -

    exports.listByUser = function(req, res) {
    Attack.find({user: req.user._id}, function(err, attacks) {
        if(err) 
            return next(err);
        var attacksLength = attacks.length;
        var count = 0;
    
        async.whilst(function () { 
              return count < attacksLength; 
           },
           function (callback) {
    
              attacks[count].evaluateFight(function(err, result){
                 count++;
                 callback();
              }); // assuming it returns a callback on success
    
            },
          function (err) {
             // all the iterations have been successfully called 
            // return the response
            res.json(attacks);
         });
    
    };
    

    【讨论】:

    • 您好,感谢您的快速响应,但我不知道,如何返回回调? mongoose.model('Game').findOneAndUpdate({ '_id': game._id }, { '$set': something }, function(err, data) {// return callback HERE});
    • mongoose.model('Game').findOneAndUpdate({ '_id': game._id }, { '$set': something }, function(err, data) { callback(err, data); // this is the callback thats been passed from async });
    • 另外,你的evaluateFight函数应该接受一个回调为evaluateFight(callback){ mongoose.model('Game').findOneAndUpdate({ '_id': game._id }, { '$set': something }, function(err, data) { callback(err, data); // this is the callback thats been passed from async }); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多