我如何使用节点asynchronous来获取我的mongoose电话?

我正在build立一个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 }); }; 

我如何使用这与asynchronous? 或者我应该使用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); }); 

基本上我想先取得意见和投票,然后提交我的提交。

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

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