【问题标题】:Stop promises execution once the first promise resolves一旦第一个 Promise 解决,就停止 Promise 的执行
【发布时间】:2016-06-29 17:51:04
【问题描述】:

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

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

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

【问题讨论】:

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

标签: javascript promise es6-promise cancellation


【解决方案1】:

Promise 不会“执行”。它们是返回值,而不是函数。对于任何返回的函数,promise 都不是控制界面。听起来您想取消 getImageUrlAsync(),所以我会在该 API 中寻找取消 API。

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

【讨论】:

    【解决方案2】:

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

    尝试使用循环,例如while

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 2015-12-27
      • 2023-03-31
      • 2018-01-24
      • 1970-01-01
      • 2019-08-03
      相关资源
      最近更新 更多