在发送请求之后和 wait/download 时间之前中止 JS fetch()

Abort a JS fetch() after request is sent and before the wait/download time

我的问题:

我目前正在尝试向 url 发送多个 fetch() 请求,而无需等待服务器的响应。

确切的用例是构建一个小型 chrome 扩展,增加外部服务器(我无法控制)上的计数器,该计数器在 GET 请求时递增。

但是,为了用户体验,我想尽快完成。

我尝试了什么:

我的第一次尝试是在 100 毫秒后取消提取。

这在连接良好且计算机速度快的情况下工作正常,但如果我两者都没有,则 fetch() 会很快中止:请求永远不会发送。

这是我目前的代码:

    let controller = new AbortController();
    let timer = setTimeout(() => controller.abort(), 100);

    await fetch(url, {signal: controller.signal}).catch(err => {
    if (err.name === 'AbortError') {
      }
    });
    clearTimeout(timer);

问题:

有没有办法知道提取何时通过提取的“发送请求”部分,以便我可以立即中止它?

I am trying to send several requests to a url without having to wait for the server's response.

这就是sendBeacon的意思,不需要涉及fetch

如果那不符合您的要求,您仍然可以使用 fetch - 没有什么强制您使用 await.

Is there a way to know when a fetch has passed the "send request" part of the fetch so I can abort it right there?

没有。并且中止请求无论如何都不是正确的解决方案。请注意,即使仅在发送 HTTP 请求后才关闭连接,服务器可能仍会注意到这一点,并且不会在没有可写响应目的地的情况下处理请求。

如果你想发送请求但不需要你应该使用 HEAD 方法发送的回复的 body,这会指示服务器只回复 header调用而不是 body,因此您可以检查 header 包

中的状态或内容类型等

尽快发送 10 个请求,然后等待响应

const pending=[];
for(let i=0;i<10:i++)
{
    pending.push(fetch(url, {method:"HEAD"});
}
for(const req of pending){
    const res = await req;
    //check for a 200 code or any other bodyless data
}

或者如果您真的不关心响应,则无需等待 promise 完成

for(let i=0;i<10:i++)
{
    fetch(url, {method:"HEAD"});
}

aborting 用于即使尚未发送也想终止呼叫的情况

如@Bergi 所述,如果您只想 ping url,则可以使用

navigator.sendBeacon(url) 

但这会发送一个 post 请求,让您无法控制对请求的处理