在发送请求之后和 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 请求,让您无法控制对请求的处理
我的问题:
我目前正在尝试向 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 请求,让您无法控制对请求的处理