【问题标题】:Removing Fetch API default timeout删除 Fetch API 默认超时
【发布时间】:2018-11-01 08:58:03
【问题描述】:

我正在使用来自 Google Chrome 或 Mozilla Firefox 的本机获取向我的服务器发送查询:

fetch(url, {
  method: 'POST',
  body: formData,
  credentials: 'include'
})

我设置了一个服务器在 3 分钟后发送响应,并意识到两个浏览器只等待 2 分钟。 Firefox 在失败前再次重新发送请求。

有没有办法定义大于 2 分钟的超时(比如无限)?

【问题讨论】:

标签: javascript google-chrome firefox fetch-api


【解决方案1】:

就我在 MDN 上阅读 fetch() 的文档而言,它没有任何方法可以指定超时。

如果你使用 nodejs,你可以使用 requestaxios 模块。 或者您可以使用 XMLHttpRequest(浏览器中的纯 javascript)。

更多信息HTTP request timeouts in JavaScript

【讨论】:

  • 在我看来 XMLHttpRequest 超时适用于 FireFox,您可以将其设置为任何值,如果您不设置默认值,它将永远等待。很好,虽然我更喜欢使用 fetch()。但是无论我做什么,Chrome 似乎总是在大约 2 分钟后超时。
【解决方案2】:

我求助

async function fetchJSON(url: string, data: any = {}, method: string = "POST"): Promise<any> {
    const start = new Date().getSeconds();

    while (new Date().getSeconds() - start < 10) {
        try {
            const res = await fetch(url, {
                method,
                headers: {
                    "Content-Type": "application/json; charset=utf-8"
                },
                body: JSON.stringify(data)
            });

            try {
                return await res.json();
            } catch (e) {
                if (res.status < 400) {
                    return res.status;
                } else {
                    throw e;
                }
            }
        } catch (e) {
            await new Promise((resolve) => {
                setTimeout(resolve, 1000);
            })
        }
    }
}

即超时为10秒。

【讨论】:

    【解决方案3】:

    为了使超时“无限”,我使用这个:

    fetch (serverUrl)
    .then
    ( resp  => resp.json()
    )
    .then
    ( json => $cback (json)
    )
    .catch
    ( e    => $cback (e)
    );
    

    '$cback' 是一个范围内可见的回调函数 它检测它的第一个参数是否是 instanceof 错误。如果是这样,它将重新调用 fetch()。 如果它没有检测到它是一个错误,它使用 响应任何它的意图,然后 重新调用 fetch。

    这似乎在 FireFox 上运行良好。提取确实 不是超时,这是我想要的。很遗憾 在 Chrome 上 fetch() 总是在大约 2 分钟后超时 换句话说,这会导致捕获子句触发 超时被视为错误。但我明白了。

    在 Chrome 上对我来说真正的问题是,即使 尽管我发现了错误,但它仍然会产生 关于无响应请求的日志中的错误条目。 因此,如果用户在去之前让他们的浏览器保持打开状态 吃午饭时,他们会看到很多错误信息 浏览器日志(如果他们愿意看的话),恐怕 那里的错误数量将导致他们 “吓坏了”。

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 2017-10-22
      • 2012-02-12
      • 2016-05-16
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多