es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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 a controller.abort() cuando quieras cancelar la operación. Aquí tienes un ejemplo:

    const controller = new AbortController();
    
    async function myFunc() {
      try {
        let response = await oneHourLastingFunction({ signal: controller.signal });
        myProcessData(response);
      } catch (e) {
        if (e.name === 'AbortError') {
          console.log('La operación fue cancelada');
        } else {
          console.log('Algo más salió mal');
        }
      }
    }
    
    // Llama a esto para cancelar la operación
    controller.abort();
    

    Ten en cuenta que la función oneHourLastingFunction necesita admitir la cancelación comprobando la propiedad signal.aborted periódicamente y deteniendo la ejecución si es true. 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á un AbortError.

Comments are closed.