目前,此代碼打印出一個零,因爲數組中的第一個承諾立即解決。如何處理承諾,因爲他們解決?
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
回調的第二個參數是承諾的索引,但事實並非如此,因爲then
只是另一個承諾的then
,所以它如何知道它應該返回一些無論如何索引。你能想出更好的方法嗎?
另外,我運行了第一個race
的所有承諾,但這對後續的race
不應該是個問題,對吧?如果在後續的race
調用之前解決了另一個承諾,它應該只是返回它,沒問題,對不對?如果同時解決了多個承諾,它只會返回第一個(按陣列順序或按照分辨率順序?),然後下一個race
會返回第二個,等等......對吧?
順便說一句我也儘管我可以走陣列並刪除isResolved
的承諾,但那不是真的。不過,即使這樣,對於race
調用之間的多個承諾解決的情況,這種情況也會徹底破壞。
你可以讓Promises解決一個值,該值標識承諾,以及你之後的價值 - 就你的例子而言,你的價值就是索引,所以做你想做的事情是很微不足道的。代碼 –
承諾。當你只關心其中一個決議時使用race()。 - 對於順序執行,只需將.then()子句添加到單個承諾中,也可以返回一個承諾。然後 - 對於並行執行,使用Promise.all在Mattias Buelens中回答 –