【问题标题】:How can I use node async to fetch my mongoose calls?如何使用节点异步来获取我的猫鼬电话?
【发布时间】:2013-03-12 02:34:45
【问题描述】:

我正在使用 node/express/mongoose 构建一个站点,它在查看提交时需要执行以下操作。

我遇到的问题是以非串行方式进行数据库获取。例如,我将执行一些调用来获取一些数据,但是在执行上下文转到另一个调用之前,某些调用可能不会完成。尝试使用 npm 模块 async,但在尝试弄清楚如何集成它时遇到了麻烦。

这是我的代码:

var getViewCount = function(submissionId) {
  Submission.getSubmissionViewCount({
    submissionId : submissionId
  }, function(err, count) {
    if (err) {
      throw err;
    }

    if (count) {
      return count;
    }
  });
};

var getVotes = function(submissionId) {
  console.log('getvotes');
  Submission.getSubmissionVotes({
    submissionId : submissionId
  }, function(err, votes) {
    return votes;
  });
};

var getSubmission = function(id) {
  Submission.getSubmission({
    id : id
  }, function(err, submission) {
    if (err) {
      throw err;
    }

    if (submission) {
      return submission;
    }
  });
};

var renderSubmission = function(title, submission, views) {
  res.render('submission', {
      title: submission.title + ' -',
      submission: submission,
      views: views.length
  });
};

如何将它与异步一起使用?或者我应该使用async.series 而不是async.async

async.series([
  function(callback) {
    var submission = getSubmission(id);
    callback(null, submission);
  },
  function(callback) {
  //  getViewCount(submissionId);
  },
  function(callback) {
//    getVotes(submissionId);
  },
  function(callback) {
    //renderSubmission(title, submission, views);
  }
  ], function(err, results) {
    console.log(results);
  });

基本上我想先获取意见和投票,然后再渲染我的提交。

【问题讨论】:

  • 例如,getSubmission 函数中的返回不会从Submission.getSubmission 的回调中返回任何内容。您需要沿着 submitId 参数也给它一个回调并在 db 回调中而不是 return submission 有它 callback(submission)
  • 你看过async的队列方法吗?总体思路是@TheBrain 和 RobertMitchell 所建议的。回调函数是关键。过去,我曾成功使用 queue、drain 和 forEach(用于数据库调用列表)方法对 MS SQL 服务器进行异步调用。
  • @TheBrain 很好,谢谢。

标签: javascript node.js mongodb asynchronous mongoose


【解决方案1】:

TheBrain 对您应该对代码进行的整体结构更改的描述是准确的。 Node 中的基本方法是嵌套一系列回调;您很少需要实际返回值的函数。相反,您定义一个将回调作为参数并将结果传递给该回调的函数。请查看下面的代码进行澄清(其中cb 是一个回调函数):

var getViewCount = function(submissionId, cb) {
    Submission.getSubmissionViewCount({
        submissionId : submissionId
    }, function(err, count) {
        if (err) {
            throw err;
        }

        if (cb) {
            cb(count);
        }
    });
};

var getVotes = function(submissionId, cb) {
    console.log('getvotes');
    Submission.getSubmissionVotes({
        submissionId : submissionId
    }, function(err, votes) {
        if (cb) {
            cb(votes);
        }
    });
};

var getSubmission = function(id, cb) {
    Submission.getSubmission({
        id : id
    }, function(err, submission) {
        if (err) {
            throw err;
        }

        if (cb) {
            cb(submission);
        }
    });
};

var renderSubmission = function(submissionId) {

    getSubmission(submissionId, function (submission) {
        if (!submission) {
            // unable to find submission
            // add proper error handling here
        } else {
            getViewCount(submissionId, function (viewCount) {
                res.render('submission', {
                    title: submission.title + ' -',
                    submission: submission,
                    views: viewCount
                });
            });
        }
    };
};

【讨论】:

  • 啊,是的,这个回调汤在一段时间后变得相当草率,但是作为最后一个参数抛出回调可以正常工作。我会坚持下去,直到找到更好的方法。谢谢。
猜你喜欢
  • 2014-11-19
  • 2020-04-25
  • 2021-06-20
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2015-10-23
  • 2017-02-22
相关资源
最近更新 更多