2016-03-14 18 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; 
    } 
    } 
}