2017-08-12 3 views
0

Ich habe einen solchen Code:Kann die Asynchronität von JavaScript-NodeJS Griff

function onDoneFunction() 
    { 

    console.log("done!"); 

    } 

    function generalQuery(generalArray, onDoneFunction) 
    { 

    function go(i) 
    { 

     if(i >= generalArray.length) 
     { 
      onDoneFunction(); 
     } 
     else 
     { 
      iteratorFunction(generalArray[i], function() 
      { 
      console.log("entering callback " + i); 
      return go(i + 1); 
      }); 

     } 
    } 

    go(0); 
    } 

Und mein iteratorFunction wie folgt aussieht:

function iteratorFunction(partofquery, callback) 
{ 
    var index = generalArray.indexOf(partofquery); 

    collection.find(partofquery).then(function(data) 
    { 
     console("query completed " + index); 
    } 
} 

meiner Anfrage Array hat zwei Elemente Gesetzt, ich sehe solche Ausgänge:

Eingabe Rückruf 0

Eingabe Rückruf 1

Abfrage abgeschlossen 0

Abfrage abgeschlossen 1

Aber ich versuche, dies zu sehen:

Eingabe Rückruf 0

Abfrage abgeschlossen 0

eingeben Rückruf ing 1

Abfrage abgeschlossen 1

Ich habe Schleife Wartezeit zu machen versucht, für eine Iteration vor dem Start des nächsten zu beenden. Ich habe viele Dinge ausprobiert. Wie Sie sehen können, habe ich auch Rekursion versucht. Aber das kann ich nicht erreichen. Könntest du mir bitte zeigen, was ich falsch mache? Danke im Voraus.

+0

'. dann - ahh, also musst du einige Versprechungen durch das Aussehen verketten –

+0

@JaromandaX Könntest du mit meinem Code ein Beispiel zeigen? – jason

+0

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

Antwort

1

Simplest beheben, um Ihren Code

function onDoneFunction() { 
 
    console.log("done!"); 
 
} 
 

 
function iteratorFunction(partofquery, index) { 
 
    return collection.find(partofquery).then(function(data) { 
 
     console("query completed " + index); 
 
    }); 
 
} 
 

 
function generalQuery(generalArray, onDoneFunction) { 
 
    function go(i) { 
 
     if (i < generalArray.length) { 
 
      console.log("performing query " + i); 
 
      return iteratorFunction(generalArray[i], i).then(function() { 
 
       return go(i + 1); 
 
      }); 
 
     } 
 
    } 
 
    go(0).then(onDoneFunction); 
 
}

jedoch Rekursion nicht die beste Lösung ist - aber Sie haben fragen Sie nach an example using my code

Verwendung von Array # Rekursion statt reduzieren

function generalQuery(generalArray, onDoneFunction) { 
    generalArray.reduce((promise, item, index) => 
     promise.then(() => 
      iteratorFunction(item, index) 
     ), 
     Promise.resolve() 
    ).then(onDoneFunction); 
} 
+0

Sind 'onFunctionDone' und' onDoneFunction' gleich? – jason

+0

warten - ich vermasselt –

+0

Also, ich muss nur Callbacks abbrechen und Versprechungen verwenden, habe ich recht? – jason