如何使用节点异步来获取我的猫鼬电话?
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 的猫鼬?