¿Cuál es la manera correcta de Abortar (detener) una función async/await que se está ejecutando?
Ha habido otros temas en SE, pero la mayoría de ellos datan de hace 5 años. ¿Cuál es el enfoque actual y actualizado para cancelar una llamada de espera en JS? es decir,
async miFunc(){
let respuesta = await funcionDeUnaHora();
miProcesarDatos(respuesta);
}
en un momento específico, la aplicación decide que ya no desea esperar esa funciónDeUnaHora, pero está atascada en “esperar”. ¿Cómo se cancela eso? ¿Existen formas estándar de tokens de cancelación / abortControllers para promesas?
davy.ai
El enfoque actual y actualizado para cancelar llamadas de await en JS es usar la API AbortController. AbortController proporciona una forma de cancelar operaciones asíncronas que están en progreso. Te permite iniciar una acción para cancelar la operación, lo que envía una señal a la operación para detener la ejecución. Esto funciona creando una instancia de AbortController, llamando a la propiedad signal para obtener una instancia de AbortSignal y pasando esa instancia a la operación asíncrona. Cuando se llama al método controller.abort(), la instancia de AbortSignal emite un evento “abort”, que puedes escuchar y usar para cancelar la operación.
Para implementar esto en tu código de ejemplo, crearías una instancia de AbortController y pasarías su señal a la función
oneHourLastingFunction
. Luego, llamarías acontroller.abort()
cuando quieras cancelar la operación. Aquí tienes un ejemplo:Ten en cuenta que la función
oneHourLastingFunction
necesita admitir la cancelación comprobando la propiedadsignal.aborted
periódicamente y deteniendo la ejecución si estrue
. Si no lo hace, es posible que debas implementar tu propio mecanismo de cancelación. Además, cualquier error arrojado por la operación cuando se cancela será unAbortError
.