2016-04-25 3 views
-1

Ich bin gerade mit einer Situation in meiner aktuellen Arbeit konfrontiert. Ich möchte das beste Muster wissen, in diesem Szenario arbeitenSchließen Sie den asynchronen Aufruf für jede Schleife ab und gehen Sie weiter. Knoten js

Mein Code so etwas wie dieses

ist
for(var i =0 ;i < collection.length; i++){ 
    asynCall(collection[i],function(){....})//doing a asynchronous call 
} 

Ich möchte nur die besten patten kennen, um die Funktionalität wie

ich tun möchte, zu Ergänzen jeden asynchronen Aufruf zu einer Zeit und nehmen den nächsten Datensatz,

  • für i = 0 tun, um die asynchrone Funktion, es abgeschlossen ist, gehen sie zum nächsten
  • für i = 1 die asynchrone Funktion tun, füllen Sie es, gehen Sie zum nächsten

und so weiter, bei jeder Iteration ‚i‘ ich den asynchronen Aufruf abschließen möchten, und nachdem sie nehmen nur die nächste Abschluss Aufzeichnung

Gibt es eine Methode, um die Funktionalität auf diese Weise zu tun. Oder gibt es eine andere Möglichkeit, es zu tun, gibt es keine Module in npm, die mir helfen können

Bitte leite mich mit den besten Lösungen

Antwort

0

Der einfachste Ansatz, eine Bibliothek zu verwenden, wäre die Asynchron-Steuerfluss verwaltet, wie async.js.

Sie könnten async.series verwenden, um asynchrone Funktionen nacheinander aufzurufen.

async.series([ 
    function (callback) { 
    asynCall(collection[0], callback); 
    }, 
    function (callback) { 
    asynCall(collection[1], callback); 
    }, 
    ... 
]); 

Oder, wenn Sie es vorziehen, Dinge einfach zu halten, könnten Sie nur alte Rekursion verwenden.

var i = 0; 
(function loop() { 
    asynCall(collection[i], function() { 
    if (++i < collection.length) loop(); 
    }); 
}()); 

Wenn Sie wirklich in der Schleife Aufruf asynchrone Funktionen wollen, um sequentiell, es ist auch möglich, mit async/await.

function wrapInPromise(x) { 
    return new Promise(function (resolve) { 
    asynCall(x, resolve); 
    }); 
} 

var collection = ['a', 'b', 'c']; 

async function doAsyncStuff() { 
    for (var i = 0; i < collection.length; i += 1) { 
    await (wrapInPromise(collection[i])); 
    } 
} 

doAsyncStuff(); 

Obwohl, müssen Sie some effort dies tatsächlich funktioniert.

+0

in Ordnung ,, Dank Mann ...., aber nur für Neugier ich wissen will, ist es eine Möglichkeit, die ich kann – Krishna

+0

Yep für Schleife in einem Asynchron-Serie Verfahren arbeiten, das ist machbar. Ich habe meine Antwort aktualisiert. –

2

Mit async.js eachSeries:

async.eachSeries(collection, function(collectionItem, callback) { 
    asynCall(collectionItem, callback); 
}, function(err){ 
    //Handle errors here 
});