MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Node mongoose find query in loop não está funcionando


Bem-vindo à terra assíncrona :-)

Com JavaScript tudo acontece em paralelo, exceto seu código. Isso significa que, no seu caso específico, os retornos de chamada não podem ser invocados antes que seu loop termine. Você tem duas opções:

a) Reescreva seu loop de um loop for de sincronização para um loop recursivo assíncrono:
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
});

Além disso, recomendo o estudo deste blog. Ele contém mais duas etapas na escada de loop assíncrona. Muito útil e muito importante.

b) Coloque sua chamada de função assíncrona em um encerramento com formato
(function( ans ) {})(ans);

e forneça a variável que você deseja manter (aqui: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);
}