Ich versuche, eine for-Schleife auszuführen, die eine Reihe asynchroner Anforderungen in die Warteschlange stellt. Sobald alle Anfragen abgeschlossen sind, unabhängig davon, ob sie resolve
oder reject
sind, möchte ich dann etwas Code ausführen. Ich versuche, das Async/Abwarten-Muster zu nutzen, da es schöner aussieht. :)So ignorieren Sie Fehler mithilfe der Syntax async/await in JavaScript Promise.all()
Das ist, was ich tue:
var promises = []
for (item in list) {
prom = AsyncFunction(item)
promises.push(prom)
}
await Promise.all(promises)
doMoreAfter()
Allerdings scheitern einige der Versprechungen, und die zweite, die Promise.all()
ausfällt als gut passiert.
Ich möchte einfach alle fehlgeschlagenen Versprechen ignorieren und den nächsten Code ausführen, nachdem alle Versprechen abgeschlossen sind.
Ich fand Lösungen wie this.
Promise.all([a(), b(), c()].map(p => p.catch(e => e)))
.then(results => console.log(results)) // 1,Error: 2,3
.catch(e => console.log(e));
Aber es sieht nicht aus wie es funktioniert, wenn Sie versuchen, es in das async/abwarten-Format zu verwandeln.
await Promise.all(promises.map(p => p.catch(e => e)))
Was fehlt mir?
Nun, 'Promise.all()' verwirft, sobald das erste Versprechen Sie es passieren lehnt so dass der einzige Weg, es zu machen warten Für alle Versprechen zu beenden ist, jedes Versprechen, das du an "Promise.all()" übergibst, davon abzuhalten. Wenn ich diese Art von Verhalten möchte, verwende ich einfach eine dieser [Promise.settle() 'Versionen] (https://stackoverflow.com/questions/36605253/es6-promise-all-error-handle-is-setle -needed/36605453 # 36605453), die Ihnen das gewünschte Verhalten bietet, das in eine Dienstprogrammfunktion integriert ist, anstatt jedes Mal einzeln manuell zu codieren. – jfriend00