MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

La requête de recherche de nœud mongoose dans la boucle ne fonctionne pas

Bienvenue au pays asynchrone :-)

Avec JavaScript, tout se passe en parallèle, sauf votre code. Cela signifie dans votre cas spécifique que les rappels ne peuvent pas être invoqués avant la fin de votre boucle. Vous avez deux options :

a) Réécrivez votre boucle d'une boucle for de synchronisation à une boucle de recurse asynchrone :

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
});

De plus, je recommande l'étude de ce blog. Il contient deux autres marches dans l'escalier en boucle asynchrone. Très utile et très important.

b) Mettez votre appel de fonction asynchrone dans une fermeture au format

(function( ans ) {})(ans);

et fournissez-lui la variable que vous souhaitez conserver (ici :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);
}