Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 第一个承诺解决后,停止承诺执行_Javascript_Promise_Es6 Promise_Cancellation - Fatal编程技术网

Javascript 第一个承诺解决后,停止承诺执行

Javascript 第一个承诺解决后,停止承诺执行,javascript,promise,es6-promise,cancellation,Javascript,Promise,Es6 Promise,Cancellation,我使用的是ES6 promises,这个函数的思想是在一系列链接上循环,并为每个链接查找一个图像,一旦找到图像就停止 在我编写的函数中,最快的承诺会得到解决,其他承诺会继续执行,所以我想要的是在第一个承诺得到解决后立即停止其余承诺的执行 scrapImage(links) { let promises = links.map((l) => getImageUrlAsync(l)); return Promise.race(promises); } 我会说这是无法停止执行的 因为当

我使用的是ES6 promises,这个函数的思想是在一系列链接上循环,并为每个链接查找一个图像,一旦找到图像就停止

在我编写的函数中,最快的承诺会得到解决,其他承诺会继续执行,所以我想要的是在第一个承诺得到解决后立即停止其余承诺的执行

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

我会说这是无法停止执行的 因为当使用Promise.race时,所有承诺都同时开始

尽量使用循环,例如

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

async doSomething(links) {
  let l = links.length;
  while (l--) {
    let res = await getImageUrlAsync(links[l]);
    if (res) {
      break;
    }
  }
}
承诺不会“执行”。它们是返回值,不是函数。承诺不是任何函数返回的控制面。听起来您想取消
getImageUrlAsync()
,所以我会在任何API中查找取消API


如果没有这样的取消API,您所能做的最好的事情就是在承诺数组上进行
Promise.race
,就像您正在做的那样。正如其他人所指出的,当事情并行运行时,回忆其他启动的操作可能已经太迟了。

这是为了什么?你真正想要实现的是什么?ES6承诺不可取消,但一些第三方承诺库(如Bluebird)支持取消。我想在第一个承诺解决后停止承诺执行,如果ES6承诺无法实现,我如何实现?不,目的不清楚。你为什么要停止履行承诺?这样做的目的是什么?假设
getImageUrlAsync()
对数组的每个元素都做了大量的工作,在我得到结果后停止执行其他承诺以获得更好的性能是不合理的?当您知道要取消其他承诺时,假设
getImageUrlAsync
是一个ajax调用,请求已发送,服务器已开始处理该请求。您可以取消请求,但这不会阻止服务器继续处理该请求。如果在处理请求时服务器端有很大的开销(您希望取消),则需要某种特殊的机制来提醒服务器中止处理。总而言之,除了在特殊情况下,这似乎不值得麻烦。