Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript express js传递异步结果_Javascript_Node.js_Mongoose - Fatal编程技术网

javascript express js传递异步结果

javascript 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

我是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, 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
调用都是异步执行的,回调函数以任意顺序调用(在将来的任意时间)。您需要将回调传递给整个函数,或者开始使用承诺。