首页 > 解决方案 > 如果时间过长,是否停止执行网络请求?

问题描述

我有一些基本上fetch用 Javascript 调用的代码。第三方服务有时需要很长时间才能返回响应,并且为了更加用户友好,我希望能够在 N 毫秒后发布消息或停止连接打开。

我最近遇到过这篇文章: 如果执行时间太长,请跳过该功能。JavaScript

但是运气不佳,并且在使用以下代码时遇到了问题。我还希望有一种更现代的方法来完成这样的任务,也许使用async/await?

module.exports = (url, { ...options } = {}) => {
  return fetch(url, {
    ...options
  })
}

标签: javascriptnode.jsreactjs

解决方案


您可以结合使用Promise.raceAbortController,这是一个示例:

function get(url, timeout) {
  const controller = new AbortController();
  return Promise.race([fetch(url, {
    signal: controller.signal
  }), new Promise(resolve => {
    setTimeout(() => {
      resolve("request was not fulfilled in time");
      controller.abort();
    }, timeout)
  })]);
}

(async() => {
  const result = await get("https://example.com", 1);
  console.log(result);
})();


推荐阅读