現在、このコードは配列の最初の約束が直ちに解決されるため、ゼロを出力します。約束をどのように解決するのか?
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));
私は最速の約束が解決したら、それはpromises
配列から削除され、新しいPromise.race
コールが無になるまで繰り返し、残りの約束で作られるようにそれを作るために探しています約束が残っている。
Promise.race
は、約束の結果ではなく約束の結果を返すので、私はその約束を特定することができず、解決されたものはどれか分かりません。これを知る方法はありますか?私は、ある種の相関キーとその結果を持つ複雑なオブジェクトを返すことができると思いますが、それは変です。 Promise.race
コールバックの2番目のパラメータが約束のインデックスになることを期待していましたが、それは当てはまりません。then
はもう1つの約束のthen
なので意味がありません。とにかくインデックス。あなたはより良い方法を考えることができますか?
また、私はすべての約束事を最初のrace
で実行しますが、その後のrace
sの問題ではないでしょうか?その間に別の約束が解決された場合は、それ以降のrace
コールが行われる前に、それを返すだけで問題はありません。その間に複数の約束が解決された場合は、最初の配列を配列順または解決順序で返し、次にrace
は2番目を返します。
私は配列を歩いてisResolved
の約束を取り除くこともできましたが、それは本当のことではありません。しかし、たとえそれがあったとしても、race
への呼び出しの間に複数の約束が解決された場合、これは完全に中断されます。
プロミスは、将来の価値だけでなく、約束を識別する値に解決することができますか?例の場合は、あなたの価値はインデックスなので、あなたが望むことをするのは簡単ですコード –
プロミス。race()は、あなたが決議のうちの1つだけを気にするときに使用されます。 - 逐次実行の場合は、単一の約束に.then()節を追加するだけで、約束を返すこともできます。 - パラレル実行の場合、Promise.allをMattias Buelensの回答 –