Wie das zu tun Versprechen.alle array-array-Versprechungen?
Ich versuche zu laufen array der Funktionen parallel und wenn alle abgeschlossen, ich will die Arbeit auf das Ergebnis.
Ich bin mit Versprechungen. Nun, ich kann alle Funktionen in einem array und kann
Versprechen.alle(array der Funktionen)
Aber ich habe array wie
[[promise1, promise2], [promise3,promise4], [promise5,promise6]],
wo jedes Versprechen ist promisified Funktion.
Versprechen Referenz-Dokument sagt-parameter in Versprechen.alle sollten einen wiederholenden Objekt, und mein array ist durchsuchbar.
Aber es ist nicht für mich arbeiten. Ich denke, Es ist die Ausführung [promise1, promise2] als ein Versprechen, aber keine einzelnen Versprechen.
Kann jemand bitte mir helfen, wie ich es erreichen kann oder gibt es eine bessere Möglichkeit ?
- Sie müssen Merge/flatten ein mehrdimensionales array in JavaScript? so dass Sie nur noch ein flaches array von Versprechungen, wie es erforderlich ist.
- Wer kanonisch downvoted alle Antworten, kommentieren Sie bitte, was ist falsch mit Ihnen.
promise.all
nimmt ein array von promise-Objekte, erstellt aus den Rückgabewerten von Funktionen, die Sie genannt haben, bereits. "Nun, ich kann alle Funktionen in einem array und kann Versprechen.alle(array der Funktionen)" wird nicht rufen Sie die Funktionen und die Probleme lösen würde, die zurückgegeben Versprechen mit eine rekonstruierte Kopie des Arrays input.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie auch anrufen
Promise.all
für jedes array-Element:Oder direkt:
Diese Weise die äußere
Promise.all
bekommt die gruppiert verspricht in anderenPromise.all
:Array.from(arguments)
, Versprechen nur erfüllen, mit einem einzigen Wert.Promise.all called on non-object
, aber der erste code-snippet gearbeitet, danke.Können Sie einfach
Promise.all
auf alle inneren arrays, dann auf das äußere array, um ein Versprechen für die array-von-arrays:Beachten Sie, dass
Promise.all
nimmt ein array von Versprechungen, nicht ein array von promise-Rückgabe Funktionen.Promise
als die zweite argumentmap
, um diethis
Wert. Es ist das gleiche wie.map(Promise.all.bind(Promise))
Promise.all
ist eine Methode, und deshalb muss gebunden werden, umPromise
wenn Sie überschritten wird, als ein Rückruf. Man könnte, wie auch schon geschriebenPromise.all(promiseArrArr.map(promiseArr => Promise.all(promiseArr)))
Eine andere Möglichkeit ist, glätten Sie Ihr array von arrays zu einem einzigen array, das Sie dann verwenden können
Promise.all()
auf direkt. Gerade von einem Beispiel MDN, können Sie tun, wie dies mit.reduce()
und.concat()
:Diese Lösung ermöglicht den Versprechungen array enthalten entweder einzelne verspricht oder arrays von Versprechen oder eine beliebige Kombination der beiden. Es ist flexibel, und es stellt die Ergebnisse in einer einzigen abgeflachten array mit Ergebnissen, die in der gleichen Reihenfolge wie die ursprünglichen Versprechungen, sondern abgeflacht sind in einem einzigen array. Da
Promise.all()
erfordert, dass Sie übergeben Sie ein array, das andere Lösungen, die hier präsentiert wird, erfordern die Eingabe einer strengen array von arrays - das array kann keine einfachen Versprechungen in der es nur arrays von verspricht. Diese Lösung ist flexibler und akzeptiert entweder die Art der Eingabe.Zum Beispiel, dies wird gut funktionieren, wenn die Eingabe geschieht wie folgt:
Finden Sie unter arbeiten demo: https://jsfiddle.net/jfriend00/dLsktyyn/
Oder Sie finden es möglicherweise hilfreich, die
flatten()
Funktion rumliegen für andere Verwendungen:then
handler (ein flaches array von Werten) ist nicht mehr isomorph mit der input-Struktur (ein array von einem array verspricht), so ist es schwer zu vergleichen, die Versprechen, ergab die Wert. In diesem Sinne, @Bergi ' s Ansatz scheint besser zu sein.Promise.all
?Wenn Sie haben Feste Anzahl von subarrays, würde ich vorschlagen, verwenden Sie diese einfache Lösung:
Mehrere verspricht, könnte auch parallelisiert werden, wie diese:
Können Sie diesen Ansatz verwenden: