【发布时间】: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