Wie zu verwenden Versprechen in der forEach-Schleife der array zum füllen eines Objekts
Ich bin mit einer forEach-Schleife über ein array und macht zwei Anrufe, die Rendite verspricht, und das möchte ich füllen Sie ein Objekt, sagen this.options
und dann machen Sie andere Sachen mit. Jetzt habe ich das async-Problem wenn ich das folgende Codebeispiel verwenden, und ich bekomme in der dann die Funktion first.
$.when.apply($, someArray.map(function(item) {
return $.ajax({...}).then(function(data){...});
})).then(function() {
//all ajax calls done now
});
Diese arbeiten folgenden code, aber es funktioniert nur für das erste element im array, weil ich nenne die resultierende Funktion in der .then
von der Antwort. Ich will alles tun, die Holen zuerst für alle Elemente des Arrays und rufen Sie dann die Funktion, etwas zu tun.
array.forEach(function(element) {
return developer.getResources(element)
.then((data) = > {
name = data.items[0];
return developer.getResourceContent(element, file);
})
.then((response) = > {
fileContent = atob(response.content);
self.files.push({
fileName: fileName,
fileType: fileType,
content: fileContent
});
self.resultingFunction(self.files)
}).catch ((error) = > {
console.log('Error: ', error);
})
});
Wie kann ich Auffüllen der self.files
Objekt nach der forEach-Schleife abgeschlossen ist, und rufen Sie dann die resultierende Funktion mit den Dateien, die Objekt?
InformationsquelleAutor der Frage rond | 2016-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Promise.all()
wird hier hilfreich sein:Dadurch wird der AJAX-Aufruf für jedes der Elemente, fügt das Ergebnis jedes Aufrufs zu
self.files
einmal der Aufruf abgeschlossen ist, und fordertself.resultingFunction()
nachdem alle Gespräche abgeschlossen sind.Edit: Vereinfachte basierend auf Jurij Tarabanko Vorschläge.
InformationsquelleAutor der Antwort Timo
Nur eine leichte variation des akzeptierten Lösung oben wäre:
InformationsquelleAutor der Antwort IonicBurger
Könnte man auf diese Antwort auf eine ähnliche Frage für eine ausgezeichnete Hinweis. Die Lösung, die dort angegeben verwendet
Array#reduce()
zu vermeiden, zu sammeln all die Versprechen, die vor dem tun die Arbeit, anstatt mitPromise.all()
.InformationsquelleAutor der Antwort Alan Mimms
Folgende code ist einfach das Verständnis der sync mit Versprechen.
Obigen Beispiel wird halten array nums für 5 Sek. und es wird gedruckt, auf der Konsole nach release.
InformationsquelleAutor der Antwort jasmeetsohal