¿Por qué todos se quejan de las funciones de devolución de llamada en JavaScript?

La devolución de llamada no es un problema, el infierno de devolución de llamada es el problema.

Supongamos que necesitamos hacer tres llamadas al servidor para obtener A, B, C y D con la ayuda de las funciones getA, getB, getC y getD.

En codificación síncrona hacemos.

  var A = getA ();
 var B = getB (A);
 var C = getC (B);
 var D = getD (C);

En la codificación asincrónica como en JavaScript tenemos que:

  getA (función (A) { 
     getB (A, función (B) { 
            getC (B, función (C) { 
                  getD (C, función (D) { 
                      // algún código   
                 }); 
           });
     }); 
  });

Como puede ver en el código anterior, se vuelve muy complicado entender y depurar el código. Esto es de lo que todos se quejan en JavaScript.

El estilo asíncrono de codificación no es el estilo natural de codificación. Es difícil de comprender para las personas nuevas en JavaScript.

El bucle de eventos de JavaScript es de un solo subproceso. Funciona de forma asincrónica. Los navegadores son la plataforma más grande para ejecutar aplicaciones en la fecha de hoy. Los navegadores se escriben una vez ejecutados en cualquier lugar en su sentido más verdadero.

Ahora vea ¿Cómo lidiar con el infierno de devolución de llamada en JavaScript?

  • Promesas: el objeto Promesa se utiliza para cálculos diferidos y asincrónicos.
  • caolan / async: Async es un módulo de utilidad que proporciona funciones directas y potentes para trabajar con JavaScript asincrónico. Aunque originalmente se diseñó para usar con Node.js y se puede instalar a través de npm install async, también se puede usar directamente en el navegador.

Lectura adicional: promesa

La gente no se queja de las funciones de devolución de llamada, sino de las funciones de devolución de llamada anidadas , especialmente cuando tiene muchas de ellas:

function my_cool_fun() { do_smthg_async("foo", function() { ajax_call("/bar", function( data ) { send_data(data, function( resp ) { save_resp(resp, function() { register_success(function() { console.log("ok"); }); }); }); }); }); } 

Este es un ejemplo falso, pero ya ves el punto. Agrega anidamiento e indentación innecesarios.

Porque cuando está anidado, puede terminar con un código que es difícil de seguir: el infierno de devolución de llamadas infame, o la pirámide de la fatalidad. Ciertamente es mucho más difícil de seguir que el código estrictamente lineal.

Sin embargo, las promesas ayudan a mitigar algunos de estos problemas. Y una vez que los generadores se implementen más ampliamente, puede terminar con un código que se ve notablemente lineal.

Es porque hace que sea fácil escribir código de espagueti. Eso más las funciones anónimas pueden hacer una experiencia de depuración muy loca.