我正在用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参数也给它一个回调,并在数据库回调,而不是'回报提交'里面'回调(提交)' – TheBrain 2013-03-22 09:39:25
你看过异步的队列方法吗?总体思路是@ TheBrain和RobertMitchell所建议的。回调函数是关键。在过去,我已经使用queue,drain和forEach(用于db调用列表)方法成功地向MS SQL服务器进行异步调用。 – DotNetWala 2013-03-22 15:38:56
尝试寻找到基于承诺的解决方案: http://stackoverflow.com/questions/11912573/node-js-deferred-promisify-mongoose/11931908#11931908 http://stackoverflow.com/问题/ 10545087/how-to-use-q-module-for-refactoring-mongoose-code/10554943#10554943 – 2013-03-22 22:21:03