Actualmente estoy intentando enviar varias solicitudes fetch() a una URL sin tener que esperar la respuesta del servidor.
El caso de uso exacto es construir una pequeña extensión de Chrome que aumente un contador en un servidor externo (sobre el cual no tengo control) que se incrementa en las solicitudes GET.
Pero, por el bien de UX, me gustaría hacer esto lo más rápido posible.
Mi primer intento fue cancelar la búsqueda después de 100 milisegundos.
Esto funciona bien con una buena conexión y una computadora rápida, pero si no tengo ambos, la búsqueda () se cancela demasiado pronto: la solicitud nunca se envía.
Aquí está el código que tengo hasta ahora:
let controller = new AbortController(); let timer = setTimeout(() => controller.abort(), 100); await fetch(url, {signal: controller.signal}).catch(err => { if (err.name === 'AbortError') { } }); clearTimeout(timer);¿Hay alguna manera de saber cuándo una recuperación ha pasado la parte de "enviar solicitud" de la recuperación para poder cancelarla allí mismo?
Estoy tratando de enviar varias solicitudes a una url sin tener que esperar la respuesta del servidor.
Eso es lo que se supone que hace sendBeacon , no es necesario involucrar fetch .
Si eso no cumple con sus requisitos, aún puede usar fetch y simplemente no esperar la respuesta ; nada lo obliga a usar await .
¿Hay alguna manera de saber cuándo una recuperación ha pasado la parte de "enviar solicitud" de la recuperación para poder cancelarla allí mismo?
No. De todos modos, abortar la solicitud no es la solución correcta. Tenga en cuenta que incluso al cerrar la conexión solo después de enviar la solicitud HTTP, el servidor podría notarlo y no procesará la solicitud sin un destino de escritura para la respuesta.
si desea enviar una solicitud pero no necesita el cuerpo de la respuesta, debe enviar usando el método HEAD, esto le indica al servidor que solo responda con los encabezados de la llamada y no con el cuerpo, para que pueda verificar el estado o tipo de contenido, etc. que está en el paquete de encabezado
envíe 10 solicitudes lo más rápido posible y luego espere las respuestas
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 }o si realmente no le importa la respuesta, ya que no hay necesidad de esperar a que se complete la promesa
for(let i=0;i<10:i++) { fetch(url, {method:"HEAD"}); }abortar es para cuando desea finalizar la llamada incluso si no se ha enviado
como menciona @Bergi, si solo desea hacer ping a la URL, puede usar
navigator.sendBeacon(url)pero esto enviará una solicitud posterior que le dará mucho menos control de lo que hace con la solicitud