Javascript 如何使用node async获取mongoose调用?
我正在用node/express/mongoose构建一个站点,在查看提交时,它需要执行以下操作 我遇到的问题是以非串行方式进行db获取。例如,我将执行一些调用来获取一些数据,但有些调用可能在执行上下文转到另一个上下文之前不会完成。尝试使用npm模块async,但在尝试如何集成它时遇到了问题 这是我的密码:Javascript 如何使用node async获取mongoose调用?,javascript,node.js,mongodb,asynchronous,mongoose,Javascript,Node.js,Mongodb,Asynchronous,Mongoose,我正在用node/express/mongoose构建一个站点,在查看提交时,它需要执行以下操作 我遇到的问题是以非串行方式进行db获取。例如,我将执行一些调用来获取一些数据,但有些调用可能在执行上下文转到另一个上下文之前不会完成。尝试使用npm模块async,但在尝试如何集成它时遇到了问题 这是我的密码: var getViewCount = function(submissionId) { Submission.getSubmissionViewCount({ submissio
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?或者我应该使用async.series
isntead的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中的基本方法是嵌套一系列回调;您很少需要实际返回值的函数。相反,您可以定义一个函数,该函数将回调作为参数,并将结果传递给该回调。请查看下面的代码以进行说明(其中,
cb
是回调函数):
例如,
getSubmission
函数中的返回不会从Submission.getSubmission
的回调返回任何内容。您需要沿着submissionId参数给它一个回调,并在db回调中而不是返回提交
让它回调(提交)
您看过async的队列方法吗?总的想法是@TheBrain和RobertMitchell所建议的。回调函数是键。过去,我使用queue、drain和forEach(用于db调用列表)方法成功地对MS SQL server进行了异步调用。尝试寻找基于承诺的解决方案:@TheBrain good call Thank。啊,是的,这个回调汤在一段时间后变得非常松散,但作为最后一个参数抛出回调效果很好。我会一直坚持下去,直到找到更好的方法。谢谢
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
});
});
}
};
};