javascript express js传递异步结果
我是js的新手。 我将express用于node js,将mongoose用作mongo ormjavascript express js传递异步结果,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我是js的新手。 我将express用于node js,将mongoose用作mongo orm function direct_tags_search_in_db(tags){ var final_results = []; for (var i=0; i<tags.length; ++i) { var tag = tags[i]; Question.find({tags: tag}).exec(function(err, question
function direct_tags_search_in_db(tags){
var final_results = [];
for (var i=0; i<tags.length; ++i) {
var tag = tags[i];
Question.find({tags: tag}).exec(function(err, questions) {
final_results.push(questions);
if (i == tags.length -1 ){
return final_results;
}
});
}
};
功能直接搜索标签搜索数据库(标签){
var最终结果=[];
对于(var i=0;i您经常会发现Question.find()等方法.exec
接受函数作为参数是异步的。这对于执行网络请求或文件系统操作的方法尤其常见。这些方法通常称为回调。在这种情况下,如果您希望在异步任务完成时发生某种情况,还需要实现回调
此外,您对标记的引用可能以不希望的方式被更改。有许多解决方案,下面是一个简单的解决方案
function direct_tags_search_in_db(tags, callback){
var final_results = [];
// Array.forEach is able to retain the appropriate `tag` reference
tags.forEach(function(tag){
Question.find({tags: tag}).exec(function(err, questions) {
// We should be making sure to handle errors
if (err) {
// Return errors to the requester
callback(err);
} else {
final_results.push(questions);
if (i == tags.length -1 ){
// All done, return the results
callback(null, final_results);
}
}
});
});
};
您会注意到,当我们实现自己的回调时,我们遵循与Question.find().exec(function(err,result){});
--第一个参数是潜在错误,第二个参数是结果的回调相同的公共模式。这就是为什么当我们返回结果时,我们将null作为第一个参数回调(空,最终结果);
调用此函数的快速示例:
direct_tags_search_in_db([1, 2, 3], function(err, results){
if (err) {
console.error('Error!');
console.error(err);
} else {
console.log('Final results');
console.log(results);
}
});
解决各种异步目标的另一个选项是模块、承诺或其他。您没有异步思考。每个find().exec
调用都是异步执行的,回调函数以任意顺序调用(在将来的任意时间)。您需要将回调传递给整个函数,或者开始使用承诺。