sql >> Base de Datos >  >> NoSQL >> MongoDB

La consulta de búsqueda de mangosta de nodo en bucle no funciona

Bienvenido a async-land :-)

Con JavaScript todo sucede en paralelo excepto tu código. Esto significa que, en su caso específico, las devoluciones de llamada no se pueden invocar antes de que finalice su ciclo. Tienes dos opciones:

a) Reescriba su bucle de un bucle for de sincronización a un bucle recurso así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
});

Adicionalmente recomiendo el estudio de este blog. Contiene dos pasos más en la escalera de bucle asíncrono. Muy útil y muy importante.

b) Ponga su llamada de función asíncrona en un cierre con formato

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

y proporcione la variable que desea conservar (aquí: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);
}