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.

Cómo mantener la función sin fallar incluso si algún trabajo asíncrono falla?

Estoy creando un servidor backend con Node.js (basado en Nest.js). Cada manejador de ruta consulta o modifica principalmente la base de datos (efecto principal), y a veces envía eventos a un servidor externo, registra información, etc. (efecto secundario).

Quiero que las funciones de cada manejador de ruta no fallen cuando solo el efecto secundario arroje un error y el efecto principal funcione correctamente (comportamiento 1). También quiero que los efectos secundarios se ejecuten en paralelo con el efecto principal para que el tiempo de ejecución de cada función de manejo de ruta pueda disminuir (comportamiento 2).

¿Cómo puedo lograr este comportamiento en JavaScript? Primero intenté este código:

async routeHandler() {
  sideEffect().catch(console.error)

  await mainEffect();
}

Sin embargo, cuando la función sideEffect arroja un error, la función routeHandler falla. Puedo intentar lo siguiente, pero no cumple con el comportamiento 2.

async routeHandler() {
  try {
    await sideEffect();
  } catch (error) {
    console.error(error);
  }

  await mainEffect();
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el comportamiento 1 y 2, puedes utilizar Promise.all para ejecutar el efecto principal y el efecto secundario en paralelo, y manejar los errores por separado utilizando Promise.catch. Aquí tienes un ejemplo de fragmento de código:

    async routeHandler() {
      const mainPromise = mainEffect();
      const sidePromise = sideEffect().catch(console.error);
    
      await Promise.all([mainPromise, sidePromise]);
    }
    

    Este código ejecutará mainEffect y sideEffect en paralelo, y si se produce algún error en sideEffect, se capturará y se registrará en la consola sin que se produzca un fallo en la función routeHandler. De esta manera, puedes lograr el comportamiento 1 y 2 simultáneamente.

Comments are closed.