Estoy implementando llamadas de recuperación abortables .
Hay básicamente dos razones para abortar la búsqueda en mi página:
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?
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();