我使用ES6承諾,此功能的想法是循環訪問鏈接數組,並且每個鏈接查找圖像並在發現圖像時停止。一旦第一個承諾解決,立即停止承諾執行
在我寫這個函數的情況下,最快的承諾解決了,其他人一直在執行,所以我想要的是一旦第一個解決就停止執行剩下的承諾。
scrapImage(links) {
let promises = links.map((l) => getImageUrlAsync(l));
return Promise.race(promises);
}
我使用ES6承諾,此功能的想法是循環訪問鏈接數組,並且每個鏈接查找圖像並在發現圖像時停止。一旦第一個承諾解決,立即停止承諾執行
在我寫這個函數的情況下,最快的承諾解決了,其他人一直在執行,所以我想要的是一旦第一個解決就停止執行剩下的承諾。
scrapImage(links) {
let promises = links.map((l) => getImageUrlAsync(l));
return Promise.race(promises);
}
承諾不「執行」。他們是返回值,而不是函數。承諾不是任何函數返回的控制表面。聽起來你想取消getImageUrlAsync()
,所以我會尋找一個取消API在任何API。
如果沒有這樣的取消API,您可以做的最好的就是承諾數組中的Promise.race
,就像您正在做的一樣。正如其他人指出的那樣,當事情平行進行時,回想其他已啓動的行動可能已經太遲了。
我會說這是沒有辦法停止執行 「導致所有承諾,同時開始使用時Promise.race。
嘗試使用循環,例如while。
使用ES7的一些示例代碼,如果您使用的是babel。
async doSomething(links) {
let l = links.length;
while (l--) {
let res = await getImageUrlAsync(links[l]);
if (res) {
break;
}
}
}
這是什麼目的?你究竟在努力實現什麼? ES6承諾不可取消,但一些第三方承諾庫(如Bluebird)支持取消。 – JLRishe
我想在第一次解決時停止承諾執行,如果es6不可能承諾如何實現該目標? – zianwar
不,目的不明確。爲什麼你想停止承諾的執行?這個服務的目標是什麼? – JLRishe