Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

140
Vistas
AbortController.abort(motivo), pero el motivo se pierde antes de que llegue a la cláusula fetch catch

Estoy implementando llamadas de recuperación abortables .

Hay básicamente dos razones para abortar la búsqueda en mi página:

  • el usuario decide que no quiere esperar más por los datos AJAX y hace clic en un botón; en este caso, la interfaz de usuario muestra un mensaje "llamada/lo que haya interrumpido"
  • el usuario se ha movido a otra parte de la página y los datos que se están recuperando ya no son necesarios; en este caso, no quiero que la interfaz de usuario muestre nada, ya que solo confundiría al usuario

Para discriminar los dos casos, estaba planeando usar el parámetro de reason del método AbortController.abort , pero la cláusula .catch en mi llamada de búsqueda siempre recibe una DOMException('The user aborted a request', ABORT_ERROR) .

Intenté proporcionar una DOMException diferente como motivo de la cancelación en el caso 2, pero se perdió la diferencia.

¿Alguien ha encontrado cómo enviar información a la cláusula fetch .catch con respecto a la razón para abortar?

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

En el siguiente ejemplo, demuestro cómo determinar el motivo de un aborto de una solicitud de fetch . Proporciono comentarios en línea para la explicación. Siéntase libre de comentar si algo no está claro.

Vuelva a ejecutar el fragmento de código para ver un resultado aleatorio (potencialmente diferente)

 'use strict'; function delay (ms, value) { return new Promise(res => setTimeout(() => res(value), ms)); } function getRandomInt (min = 0, max = 1) { return Math.floor(Math.random() * (max - min + 1)) + min; } // Forward the AbortSignal to fetch: // https://docs.github.com/en/rest/repos/repos#list-public-repositories function fetchPublicGHRepos (signal) { const headers = new Headers([['accept', 'application/vnd.github+json']]); return fetch('https://api.github.com/repositories', {headers, signal}); } function example () { const ac = new AbortController(); const {signal} = ac; const abortWithReason = (reason) => delay(getRandomInt(1, 5)) .then(() => { console.log(`Aborting ${signal.aborted ? 'again ' : ''}(reason: ${reason})`); ac.abort(reason); }); // Unless GitHub invests HEAVILY into our internet infrastructure, // one of these promises will resolve before the fetch request abortWithReason('Reason A'); abortWithReason('Reason B'); fetchPublicGHRepos(signal) .then(res => console.log(`Fetch succeeded with status: ${res.status}`)) .catch(ex => { // This is how you can determine if the exception was due to abortion if (signal.aborted) { // This is set by the promise which resolved first // and caused the fetch to abort const {reason} = signal; // Use it to guide your logic... console.log(`Fetch aborted with reason: ${reason}`); } else console.log(`Fetch failed with exception: ${ex}`); }); delay(10).then(() => console.log(`Signal reason: ${signal.reason}`)); } example();

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda