2017-01-10 5 views
0

Lets sagen, dass ich den folgenden Code haben,Anruf nächste Iteration nach jedem Rückruf

function someFunction(){ 
    var i = 0; 
    while (i < 10){ 
     someAsyncProcess(someField, function(err, data){ 
      i++; 
      // i want the next iteration of the while loop to occur after this 
     } 
    } 
} 

Die someAsyncProcess läuft, und 'i' Schritten.

Aufgrund der Async-Eigenschaft von JavaScript wird die while-Schleife jedoch tausende Male vor i = 10 ausgeführt. Was ist, wenn die while-Schleife genau 10 Mal ausgeführt werden soll? Was, wenn ich möchte, dass die while-Schleife den Code nur ausführt, nachdem die Callback-Funktion beendet wurde.

Ist dies ohne eine setTimeout-Funktion möglich?

Bitte beachten Sie, dass ich noch relativ neu in JavaScript bin, also korrigieren Sie mich, wenn ich falsch Jargon verwendet.

+0

'while' synchron ist. Sie können nicht warten, bis ein asynchroner Prozess abgeschlossen ist. In diesem Fall können Sie keine while-Schleife verwenden. –

+0

Irgendwelche Alternativen? –

+0

Rekursion, Rekursion mit Versprechen, rxjs – smnbbrv

Antwort

2

while ist synchron. Sie können nicht warten, bis ein asynchroner Prozess abgeschlossen ist. Sie können in diesem Fall keine while Schleife verwenden.

Stattdessen können Sie Ihren Code in eine Funktion setzen und die Funktion selbst erneut aufrufen, wenn die Bedingung erfüllt ist.

Beispiel:

function someFunction() { 
    var i = 0; 
    function step() { 
     if (i < 10) { 
      someAsyncProcess(someField, function(err, data) { 
       i++; 
       step(); 
      }); 
     } 
    } 
    step(); 
} 

Es gibt durchaus ein paar Bibliotheken gibt, die für diese fertige Lösungen. Vielleicht möchten Sie auch in promises im Allgemeinen suchen.

+0

Dies ruft die Async-Funktion in der Initial-Schleife auf, wenn der i-Wert mehr als 10 ist. – Sajan

+0

@Sajan: Sicher, aber "i" wird hier auf "0" initialisiert, was kleiner ist als "10". –

+0

Das ist ok, aber er sucht nach einer While-Loop-Alternative, der 'i'-Wert kann alles sein, also sollte der Wert zuerst prüfen bevor die Funktion aufgerufen wird – Sajan

0

Verwenden Sie node package q, die Ihnen helfen wird, Versprechen zurückzugeben. Sie können dasselbe auf die folgende Weise mit q erreichen.

var q = require('q'); 
function someFunction(){ 

    var promises = []  
    var i = 0; 
    while (i < 10) { 
     promises.push(function() { 
      i++; 
      //write code here for using current value of i 
     }) 
    } 
    return q.all(promises); 
} 

können Sie rufen Funktion(), wie unten

someFunction().then(function(arrayOfResponseFromEachPromiseFunction) { 
    console.log(JSON.stringify(arrayOfResponseFromEachPromiseFunction, null, 4)); 
}).catch(function(err){ 
    console.log(err); 
}).done(); 

Bitte berichtigen, wenn Sie irgendeine Syntaxfehler finden. Ich hoffe es hilft.

0

Sie müssen ersetzen verwenden, während Schleifeniterationslatenzzeit mit Funktion Rekursion

function someFunction() { 
    var i = 0; 
    (function asyncWhile() { 
     if (i < 10) { 
      someAsyncProcess(someField, function(err, data) { 
       //You code here 
       i++; 
       asyncWhile(); 
      }); 
     } 
    })(); //auto invoke 
} 
Verwandte Themen