Acabo de enterarme de cómo rechazar una Promesa usando la API AbortController . Funciona bien, pero cuando la promesa se rechaza como una "Promesa secundaria", esta seguirá ejecutándose incluso si se rechaza la Promesa principal.
¿Hay alguna manera, cuando el padre es rechazado, de detener también a los niños?
En este ejemplo, esto significa que no hay más registro running después del registro rejected cuando hace clic en el botón cancelar:
let controller = new AbortController(); new Promise((resolve, reject) => { setInterval(() => console.log("running"), 500) controller.signal.addEventListener('abort', () => { console.log("rejected") reject(); }); }); function cancel() { controller.abort(); } <button onclick="cancel()">Cancel async loop</button>El controlador de promesa y cancelación está bien, es su función de temporizador la que debe borrarse.
Cuando declara setInterval , devuelve una identificación a la que se puede hacer referencia más adelante para borrar el temporizador.
Entonces, cuando rechaza la promesa, debe borrarla.
let controller = new AbortController(); new Promise((resolve, reject) => { const id = setInterval(() => console.log("running"), 500) controller.signal.addEventListener('abort', () => { console.log("rejected"); clearInterval(id); reject(); }); }); function cancel() { controller.abort(); } <button onclick="cancel()">Cancel async loop</button>