Node.js 节点mongoose在循环中查找查询不工作

Node.js 节点mongoose在循环中查找查询不工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试从循环中的猫鼬中获取记录。但它并没有像预期的那样发挥作用。我有一个包含问题和答案的哈希数组,我试图从数据库中找到这些问题。这是我的循环: for (var i=0;i < answers.length;i++) { console.log(i) var question_ans = eval('(' + answers[i]+ ')'); var question_to_find = question_ans.question.toString()

我正在尝试从循环中的猫鼬中获取记录。但它并没有像预期的那样发挥作用。我有一个包含问题和答案的哈希数组,我试图从数据库中找到这些问题。这是我的循环:

for (var i=0;i < answers.length;i++)
{
    console.log(i)
    var question_ans = eval('(' + answers[i]+ ')');

    var question_to_find = question_ans.question.toString()
    var ans = question_ans.ans.toString()
    console.log(ans)
    quiz.where("question",question_to_find).exec(function(err,results)
    {
        console.log(results)
        if (ans == "t")
        {
            user_type = results.t  
        }
        else if (ans == "f")
        {
            user_type=results.f      
        }
    })
}
问题是我的问题在循环迭代后显示出来。正因为如此,我无法处理它们

请帮忙! 问候

欢迎来到async land:-)

使用JavaScript,除了代码之外,任何事情都可以并行进行。这意味着在您的特定情况下,在循环结束之前不能调用回调。您有两个选择:

a) 将循环从同步for循环重写为异步递归循环:

function asyncLoop( i, callback ) {
    if( i < answers.length ) {
        console.log(i)
        var question_ans = eval('(' + answers[i]+ ')');

        var question_to_find = question_ans.question.toString()
        var ans = question_ans.ans.toString()
        console.log(ans)
        quiz.where("question",question_to_find).exec(function(err,results)  {
            console.log(ans, results)
            if (ans == "t") {
                user_type = results.t  
            } else if (ans == "f") {
                user_type=results.f      
            }
            asyncLoop( i+1, callback );
        })
    } else {
        callback();
    }
}
asyncLoop( 0, function() {
    // put the code that should happen after the loop here
});
并为其提供要保留的变量(此处:
ans
):

for(变量i=0;i
您可以使用和模块在循环中查找查询

运行
mainFunction()
时,该函数调用
getData()

getData()
函数是一个promise循环函数,当函数完成时,返回所有数据,您可以在
mainFunction()中获得最终数据。

基于console.log的main函数()的result

1.start mainFunction
2.start getData
3.finish find loop getData
4.finish mainFunction
5.final result : .....

感谢它的帮助。再次感谢递归循环。这将帮助我更好地理解。
(function( ans ) {})(ans);
for (var i=0;i < answers.length;i++) {
    console.log(i)
    var question_ans = eval('(' + answers[i]+ ')');

    var question_to_find = question_ans.question.toString()
    var ans = question_ans.ans.toString()
    console.log(ans)
    (function( ans ) {
        quiz.where("question",question_to_find).exec(function(err,results)  {
            console.log(ans, results)
            if (ans == "t") {
                user_type = results.t  
            } else if (ans == "f") {
                user_type=results.f      
            }
        })
    })(ans);
}
const mainFunction = async()=>{
  answers
  console.log("start mainFunction")
  resultFromFindLoob  = await getData(answers)
  console.log("finish mainFunction");
  console.log("final result:" , resultFromFindLoob)
}

mainFunction();
let async = require('async');
let q = require('q');

const getData = async (answers)=>{
  console.log("start getData")
  let defer =q.defer();
  let result = []
  async.eachSeries(answers , async(asnwer)=>{
    try {
      let data = await MyModel.find(asnwer).lean();
      //do something on data (processing)
      result.push(data)
    } catch (error) {
      console.log(error)
    }
  },()=>{
    console.log("finish find loop getData")
    defer.resolve(result)
  })
  return defer.promise
}
1.start mainFunction
2.start getData
3.finish find loop getData
4.finish mainFunction
5.final result : .....