一旦第一个承诺结算,就停止承诺执行

时间:2016-03-14 15:36:31

标签: javascript promise es6-promise cancellation

我正在使用ES6承诺,这个功能的想法是遍历链接数组,并为每个链接查找图像并在找到图像后停止。

在我编写的函数的这种情况下,最快的promise会解析,而其他的会继续执行,所以我想要的是在第一个promise解析后立即停止执行剩余的promise。

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

2 个答案:

答案 0 :(得分:4)

承诺不执行"。他们会返回值,而不是函数。承诺不是任何函数返回一个的控制表面。听起来你想要取消getImageUrlAsync(),所以我会在任何API中寻找取消API。

如果没有这样的取消API,您可以做的最好的就是承诺数组Promise.race,就像您正在做的那样。正如其他人所指出的那样,当事情并行运行时,回想起其他已发起的行动可能为时已晚。

答案 1 :(得分:1)

我会说没有办法停止执行 因为所有的承诺都是在使用Promise.race的同时开始的。

尝试使用循环,例如while

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

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