Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

135
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!