El único problema con las promesas es que IE no las admite. Edge sí, pero hay muchos IE 10 y 11: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (compatibilidad en la parte inferior)
Entonces, JavaScript es de un solo subproceso. Si no está haciendo una llamada asincrónica, se comportará de manera predecible. El hilo principal de JavaScript ejecutará una función por completo antes de ejecutar la siguiente, en el orden en que aparecen en el código. Garantizar el orden de las funciones síncronas es trivial: cada función se ejecutará completamente en el orden en que se llamó.
Piense en la función síncrona como una unidad atómica de trabajo. . El hilo principal de JavaScript lo ejecutará completamente, en el orden en que aparecen las declaraciones en el código.
Pero, agregue la llamada asincrónica, como en la siguiente situación:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
Esto no hace lo que quieres . Ejecuta instantáneamente la función 1, la función 2 y la función 3. La carga de div parpadea y desaparece, mientras que la llamada ajax no está casi completa, aunque makeAjaxCall()
haya regresado. LA COMPLICACIÓN es que makeAjaxCall()
ha dividido su trabajo en trozos que avanzan poco a poco por cada giro del hilo principal de JavaScript : se está comportando de manera astronómica. Pero ese mismo hilo principal, durante una vuelta / ejecución, ejecutó las partes síncronas de forma rápida y previsible.
Entonces, la forma en que lo manejé : como dije, la función es la unidad atómica de trabajo. Combiné el código de la función 1 y 2: puse el código de la función 1 en la función 2, antes de la llamada asíncrona. Me deshice de la función 1. Todo, incluida la llamada asincrónica, se ejecuta de manera predecible, en orden.
ENTONCES, cuando la llamada asincrónica se completa, después de varios giros del hilo principal de JavaScript, haga que llame a la función 3. Esto garantiza el orden . Por ejemplo, con ajax, el controlador de eventos onreadystatechange se llama varias veces. Cuando informa que se ha completado, llame a la función final que desee.
Estoy de acuerdo que es más desordenado. Me gusta que el código sea simétrico, me gusta que las funciones hagan una cosa (o casi), y no me gusta que la llamada ajax sea responsable de la pantalla (creando una dependencia en la persona que llama). PERO, con una llamada asincrónica incrustada en una función síncrona, se deben hacer compromisos para garantizar el orden de ejecución. Y tengo que codificar para IE 10, así que no hay promesas.
Resumen : para llamadas síncronas, garantizar el orden es trivial. Cada función se ejecuta completamente en el orden en que se llamó. Para una función con una llamada asincrónica, la única forma de garantizar el orden es monitorear cuando se completa la llamada asincrónica y llamar a la tercera función cuando se detecta ese estado.
Para una discusión de los hilos de JavaScript, consulte: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 y https://developer.mozilla.org/en-US/docs/Web/JavaScript/ EventLoop
Además, otra pregunta similar y altamente calificada sobre este tema: ¿Cómo debo llamar a 3 funciones para ejecutarlas una tras otra?
firstFunction
exactamente eso lo hace asíncrono? De cualquier manera - verifique las promesas