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 controlar el flujo de funciones asíncronas?

Tengo una cadena de funciones asíncronas que deben ejecutarse en orden. Sin embargo, si una de esas funciones falla o tarda demasiado, debe volver a activarse cierta cantidad de veces.

Entonces, mi pregunta es: ¿Cuál es la estructura estándar/elegante para tener ese flujo de control con funciones asíncronas? Por ejemplo:

funcA()
.then(resultA => funcB(resultA)
.then(resultB => funcC(resultB)
.then(…))

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una manera elegante de estructurar un flujo de control con funciones asíncronas sería utilizar la biblioteca async.js. Específicamente, el método ‘async.retry’ se puede utilizar para volver a intentar una función asíncrona fallida o lenta un cierto número de veces antes de darse por vencido. Este método toma como parámetros el número de veces para volver a intentar y una función que llamará que realizará la tarea asíncrona.

    Ejemplo:

    const async = require ('async');
    
    async.series ([
      function (callback) {
        async.retry (3, funcA, function (err, result) {
          if (err) {
            console.error ('Error:', err);
            callback (err);
          } else {
            console.log ('Resultado A:', result);
            callback (null, result);
          }
        });
      },
      function (callback) {
        async.retry (3, funcB, function (err, result) {
          if (err) {
            console.error ('Error:', err);
            callback (err);
          } else {
            console.log ('Resultado B:', result);
            callback (null, result);
          }
        });
      },
      function (callback) {
        async.retry (3, funcC, function (err, result) {
          if (err) {
            console.error ('Error:', err);
            callback (err);
          } else {
            console.log ('Resultado C:', result);
            callback (null, result);
          }
        });
      }
    ], function (err, resultados) {
      if (err) {
        console.error ('Flujo de control fallido:', err);
      } else {
        console.log ('Resultados:', resultados);
      }
    });
    
    function funcA (callback) {
      // Realizar la tarea asíncrona A
      // Llamar al callback con el resultado o el error
    }
    
    function funcB (resultadoA, callback) {
      // Realizar la tarea asíncrona B utilizando resultadoA
      // Llamar al callback con el resultado o el error
    }
    
    function funcC (resultadoB, callback) {
      // Realizar la tarea asíncrona C utilizandoresultadoB
      // Llamar al callback con el resultado o el error
    }
    

    Este código utiliza el método ‘async.series’ para ejecutar las funciones en secuencia, y el método ‘async.retry’ para volver a intentar cada función hasta 3 veces si falla o tarda demasiado. El método ‘async.retry’ toma como argumento la función a llamar (p. Ej. funcA) y una función de callback que se llamará con el resultado o error de la tarea asíncrona.

    Nota: la biblioteca ‘async’ no está incluida en la biblioteca estándar de JavaScript, por lo que debe instalarse por separado.

Comments are closed.