如何使用节点异步来获取我的mongoose调用?

时间:2013-03-22 09:33:14

标签: javascript node.js mongodb asynchronous mongoose

我使用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);
  });

基本上我想首先获取视图和投票,然后呈现我的提交。

1 个答案:

答案 0 :(得分:2)

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