忽略JavaScript提取响应中的正文

时间:2019-02-11 21:59:26

标签: javascript http fetch-api

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

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?如果是这样,是否有一种方法可以完全忽略响应流的其余部分而不会引起问题?

2 个答案:

答案 0 :(得分:1)

  

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

简而言之,不是。

const body = await response.json();

指示您的代码等待,直到下载了响应主体,它不会触发主体下载。除非有原因,否则响应主体流将下载内容然后关闭。

您可以在fetch spec中了解该过程。

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

答案 1 :(得分:1)

如果不必一定是HEAD,您可以只做一个POST,而您只想检查是否会收到400500系列错误

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

  

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

     

HEAD请求就像GET请求一样,除了主体   响应为空。您可以在需要时使用这种请求   文件的元数据,并且您希望或需要将文件的数据   运输。

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

如果您不在乎,则退出该特定范围后,GC将继续其课程,并且不再需要response。您不需要await或其他任何东西,但是它将在后台下载(保存在内存中),然后在GC运行时被丢弃。