sql >> Database >  >> NoSQL >> MongoDB

Node mangoest zoekquery in lus werkt niet

Welkom in async-land :-)

Met JavaScript gebeurt alles parallel behalve uw code. Dit betekent in uw specifieke geval dat de callbacks niet kunnen worden ingeroepen voordat uw lus is beëindigd. Je hebt twee opties:

a) Herschrijf je loop van een sync for-loop naar een async recurse-loop:

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

Daarnaast raad ik de studie van deze blog aan. Het bevat nog twee treden op de async-loop-trap. Zeer nuttig en erg belangrijk.

b) Zet ​​uw asynchrone functie-aanroep in een afsluiting met formaat

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

en geef het de variabele die je wilt behouden (hier: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);
}


  1. Maak een Multikey Index in MongoDB

  2. Parallelle uitvoering met StackExchange.Redis?

  3. Hoe werkt het Redis PubSub-abonneemechanisme?

  4. Probleem bij het retourneren van gegevens die zijn opgehaald uit DB-query's die in de lus worden aangeroepen