Momentan gibt dieser Code eine Null aus, weil das erste Versprechen im Array sofort verrechnet wird.Wie mit Versprechungen umzugehen, wie sie lösen?
const promises = [];
const promiser = (number) => new Promise((resolve, reject) => window.setTimeout(() => resolve(number), number * 100));
for (let index = 0; index < 10; index++) {
const promise = promiser(index);
promises.push(promise);
}
Promise.race(promises).then(r => console.debug(r));
Ich bin auf der Suche zu machen, so dass, sobald die schnellsten Versprechen lösen, ist es aus dem promises
Array und ein neuer Promise.race
Anruf entfernt wird, wird mit den restlichen Versprechungen gemacht, bis keine Wiederholung Versprechen ist übrig.
Da Promise.race
das Ergebnis des Versprechens zurückgibt, nicht das aufgelöste Versprechen selbst, obwohl ich nicht in der Lage bin zu identifizieren, welches Versprechen es war, das gelöst hat und ich nicht weiß, welches aus dem Array entfernt werden soll. Gibt es eine Möglichkeit, das zu wissen? Ich nehme an, ich könnte ein komplexes Objekt mit einer Art Korrelationsschlüssel und dem Ergebnis zurückgeben, aber das scheint seltsam. Ich hatte gehofft zweiten Parameter der Promise.race
Callback wäre Index der Verheißung, aber das ist nicht der Fall, und es macht auch keinen Sinn, da die then
ist nur eine then
eines anderen Versprechen, also wie würde es wissen, dass es einige zurückgeben sollte Index sowieso. Kannst du dir einen besseren Weg vorstellen?
Auch ich alle Versprechen mit der ersten race
laufen, aber das sollte kein Problem für die nachfolgende race
s, oder? Falls in der Zwischenzeit ein anderes Versprechen gelöst wurde, bevor der folgende race
Anruf getätigt wurde, sollte es einfach zurückgeben, kein Problem, richtig? Und wenn mehrere Versprechungen in der Zwischenzeit gelöst wurden, würde es einfach die erste (in Array-Reihenfolge oder in Auflösungsreihenfolge?) Zurückgeben und dann würde die nächste race
die zweite zurückgeben und so weiter ... Richtig?
BTW Ich auch, obwohl ich das Array gehen und Versprechen entfernen konnte, die isResolved
haben, aber das ist keine echte Sache. Selbst wenn dies der Fall wäre, würde dies für den Fall, dass mehrere Versprechungen zwischen den Aufrufen an race
aufgelöst werden, vollständig unterbrochen werden.
könnten Sie die Promises auf einen Wert auflösen, der das Versprechen sowie den Wert angibt, nach dem Sie suchen - im Fall Ihres Beispiels ist Ihr Wert der Index, es ist also ganz einfach, das zu tun, was Sie wollen Code –
Versprechen.race() wird verwendet, wenn Sie nur an einer der Auflösungen interessiert sind. - Für die sequentielle Ausführung, fügen Sie nur .then() -Klauseln zu einem einzigen Versprechen, können Sie auch ein Versprechen in .then - Für die parallele Ausführung, verwenden Sie Promise.all wie Mattias Buelens Antwort –