我使用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