2016-10-05 1 views
-1

Ich muss eine Funktion für jedes Element in einem Array mithilfe von Versprechen ausführen. Ich hoffe, Versprechen ist alles dafür geeignet. Der Rest der Funktionsausführungen sollte jedoch weiterhin ausgeführt werden, wenn (die Ausführung der Funktion) eines der Elemente im Array mit einem Fehler beendet wird. Versprichst du das?Ausführen einer Funktion für jedes Element in einem Array mit Versprechen

Beispiel: Im folgenden Code-Snippet muss die Funktion getInfo für jedes Objekt parallely ausgeführt werden und auch wenn das Ergebnis von getInfo (item1) zurückgegeben werden soll, wenn es verfügbar ist, ohne auf das Ergebnis warten zu müssen verfügbar für item2 & item3. Und auch geschah Fehler für einen der Artikel nicht die Ausführung der Rest der Elemente im Array

var arrayIterate = [item1, item2, item3] 

function getInfo(item){ 
    // do stuff 
}; 
+2

'Promise.all' keine Funktionen ausführen. Es wartet auf mehrere Versprechen. – Bergi

Antwort

1

beeinflussen sollte nicht benimmt sich auf diese Weise promise.all. Sie können die Funktionen jedoch manuell über ihre Rückrufe verketten.

Genau wie diese:

for(i=0;i<arr.length;i++){ myFunction('param1', function(){ }); }

myFunction(param1, callback){ if(error){ callback() }else{ //do something and then callback() } }

Wie dies auch, wenn Ihr Code Fehler wird es an dieser Stelle nicht aufhören wird, aber für alle Elemente in Array ausführen.

PS: Aber denken Sie daran, for loop sollte hier nicht verwendet werden, da es nicht auf Rückrufe warten wird. Verwenden Sie also Recursive Techniques, um die Ausführung von Funktionen für jedes Element des Arrays auszuführen.

1

Promise.all() ist perfekt dafür.

Angenommen, Sie haben eine URL-Liste und möchten die Daten von diesen URLs abrufen.

var request = require('request-promise') // The simplified HTTP request client 'request' with Promise support. Powered by Bluebird. 

var Promise = require('bluebird'); 

var urls = ["a-url", "some-other-url"]; 

var promises = []; 

// You create the promise for each url and push them in an array 

urls.forEach(function(url){ 
    promises.push(request.get(url)); 
}); 

// After that you can call the Promise.all() on this promises array and get the results. 

Promise.all(promises).then(function(results) { 
    // results is an array of results from all the urls 

    // No error encountered 

    // Celebrate victory 

}).catch(function(err) { 
    // Even if one error occurs, it will come here and won't execute any further. 
    // Handle error 

}); 

können Sie auch gehen für Promise.map()

Gehen Sie voran und die Drossel-docs lesen: http://bluebirdjs.com/docs/getting-started.html

Verwandte Themen