如何使用节点异步来获取我的猫鼬电话?

Posted

技术标签:

【中文标题】如何使用节点异步来获取我的猫鼬电话?【英文标题】: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 服务器进行异步调用。 尝试研究基于承诺的解决方案:***.com/questions/11912573/…***.com/questions/10545087/… @TheBrain 很好,谢谢。 【参考方案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
                );
            );
        
    ;
;

【讨论】:

啊,是的,这个回调汤在一段时间后变得相当草率,但是作为最后一个参数抛出回调可以正常工作。我会坚持下去,直到找到更好的方法。谢谢。

以上是关于如何使用节点异步来获取我的猫鼬电话?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用基于关键字的猫鼬在节点中进行搜索

如何使用 jest 来监视 Schema.virtual 的猫鼬?

如果用户角色(卖家与买家)有所不同,我该如何构建我的猫鼬模式?

带有异步队列和瀑布的猫鼬

如何使用外键数组在没有 _id 的猫鼬中填充?

如何使用节点 js 从猫鼬模式中读取嵌套数组元素?