2016-03-14 82 views
3

我使用ES6承諾,此功能的想法是循環訪問鏈接數組,並且每個鏈接查找圖像並在發現圖像時停止。一旦第一個承諾解決,立即停止承諾執行

在我寫這個函數的情況下,最快的承諾解決了,其他人一直在執行,所以我想要的是一旦第一個解決就停止執行剩下的承諾。

scrapImage(links) { 
    let promises = links.map((l) => getImageUrlAsync(l)); 
    return Promise.race(promises); 
} 
+1

這是什麼目的?你究竟在努力實現什麼? ES6承諾不可取消,但一些第三方承諾庫(如Bluebird)支持取消。 – JLRishe

+0

我想在第一次解決時停止承諾執行,如果es6不可能承諾如何實現該目標? – zianwar

+1

不,目的不明確。爲什麼你想停止承諾的執行?這個服務的目標是什麼? – JLRishe

回答

4

承諾不「執行」。他們是返回值,而不是函數。承諾不是任何函數返回的控制表面。聽起來你想取消getImageUrlAsync(),所以我會尋找一個取消API在任何API。

如果沒有這樣的取消API,您可以做的最好的就是承諾數組中的Promise.race,就像您正在做的一樣。正如其他人指出的那樣,當事情平行進行時,回想其他已啓動的行動可能已經太遲了。

1

我會說這是沒有辦法停止執行 「導致所有承諾,同時開始使用時Promise.race。

嘗試使用循環,例如while

使用ES7的一些示例代碼,如果您使用的是babel。

async doSomething(links) { 
    let l = links.length; 
    while (l--) { 
    let res = await getImageUrlAsync(links[l]); 
    if (res) { 
     break; 
    } 
    } 
}