【问题标题】:Ignoring body in a JavaScript fetch response忽略 JavaScript 获取响应中的正文
【发布时间】:2019-07-05 11:49:58
【问题描述】:

我有一些代码想发出请求并检查请求是否成功,但它并不关心响应正文:

async function doTheThing() {
  const response = await fetch(someUrl, { method: 'POST' });
  if (!response.ok) {
    throw new Error(`Request failed with status ${response.status}`);
  }
}

据我了解,目前尚未下载响应 body。如果我们让它挂起并且不跟进类似的事情:

const body = await response.json();

...请求/响应会保持打开状态并等待可能发生 GC 吗?如果是这样,有没有办法完全忽略响应流的其余部分而不会引起问题?

【问题讨论】:

    标签: javascript http fetch-api


    【解决方案1】:

    请求/响应会保持打开状态并等待可能发生 GC 吗?

    简而言之,没有。

    const body = await response.json();
    

    指示您的代码等待响应正文被下载,它不会触发正文下载。除非有理由不这样做,否则响应正文流将下载内容然后关闭。

    您可以在fetch spec 中阅读有关该过程的信息。

    可以在启动后中止获取请求,但由于浏览器支持问题,不建议这样做。见How do I cancel an HTTP fetch() request?

    【讨论】:

      【解决方案2】:

      如果不必是POST,您可以只执行HEAD,并且您只想检查是否会收到400500 系列错误

      https://developers.google.com/web/ilt/pwa/working-with-the-fetch-api#example_head_requests

      示例:HEAD 请求 默认情况下,fetch 使用 GET 方法,该方法 检索特定资源,但其他请求 HTTP 方法也可以 使用。

      HEAD 请求和 GET 请求一样,除了主体 响应为空。您可以随心所欲地使用这种请求 文件的元数据,并且您希望或需要文件的数据 运输。

      如果您遇到POST 请求,它在服务器端受到控制,您将收到服务器返回的任何内容,没有网络标准规定您可以告诉服务器不发送任何内容,因此服务器将拥有明确写入以允许这种行为。

      如果您不在乎,一旦您退出此特定范围并且不再需要 response,GC 就会运行它。您不需要await 它或其他任何东西,但它会在后台下载(保存在内存中),然后在 GC 运行时丢弃。

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        相关资源
        最近更新 更多