La programación asincrónica en JavaScript ha sido aceptada gradualmente por todos. Anteriormente, las personas generalmente lo implementaron a través de la anidación de devolución de llamada, SetTimeout, SetInterval, etc. El código se ve muy poco intuitivo, y es difícil entender rápidamente sin mirar toda la lógica del código. Las funciones asincrónicas en JavaScript incluyen funciones de E/S (AJAX, PostMessage, IMG Load, Script Load, etc.), funciones de tiempo (setTimeOut, setInterval), etc.
Todos estamos familiarizados con estos. En aplicaciones complejas, a menudo hay múltiples capas de anidación, e incluso pensando que no se han completado algunos pasos y las excepciones del programa son causadas. El ejemplo más simple es: por ejemplo, si inyecta un nodo en el DOM, debe esperar a que se inyecte el nodo y opere el nodo. Cuando se inyecta una gran cantidad de nodos, a menudo es difícil comprender el tiempo. Si tenemos el código para confiar en los datos de las API de terceros. No podemos aprender cómo es la latencia una respuesta de API, y otras partes de la aplicación pueden bloquearse hasta que devuelva el resultado. Las promesas proporcionan una mejor solución a este problema, no es bloqueo y está completamente desacoplado del código.
Entonces, permítanme echar un vistazo a la programación asincrónica en JavaScript. En primer lugar, le recomiendo que eche un vistazo a las promesas relativamente populares/una especificación.
Promesas/una especificación
Nota: Para facilitar la comprensión, la descripción puede diferir de las promesas/una especificación;
Las promesas de CommonJS/A especificación simplifican la programación asincrónica al estandarizar las interfaces API, lo que hace que nuestro código lógico asíncrono sea más fácil de entender.
Llamamos a la implementación de las promesas/una especificación. El objeto de la promesa tiene solo tres estados: incumplidos, cumplidos y fallidos; Inicialmente se creó con un estado no cumplido, y el estado solo puede cambiar de no cumplir a cumplir o no cumplir con fallido (fallido/rechazado). Una vez que el estado se cumple (completado) o fallido (fallido/rechazado), el estado no puede cambiar más.
La especificación de promesas/A proporciona una solución para describir el concepto de retraso (o futuro) en un programa. La idea principal no es ejecutar un método y luego bloquear la aplicación y esperar a que el resultado regrese antes de volver a llamar a otros métodos, sino devolver un objeto de promesa para satisfacer la escucha futura. Se puede escuchar tanto el estado satisfecho como el estado fallido. Promise registra las devoluciones de llamada implementando una interfaz luego para devolver el objeto Promise:
La copia del código es la siguiente: entonces (FulfilledHandler, ErrgeHandler, ProgressHandler);
Entonces la interfaz se usa para escuchar diferentes estados de una promesa. El FulfilledHandler se usa para escuchar el estado realizado, el ErrorHandler se usa para escuchar el estado fallido y el ProgressHandler se usa para escuchar el estado no cumplido. Promise no obliga a la escucha de eventos incumplidas (por ejemplo, sabemos que la versión anterior de jQuery (1.5, 1.6) diferida es una implementación de promesa, pero no implementa el estado no cumplido que escucha de un lado a otro.
En general, se cree que la interfaz entonces devuelve un nuevo objeto de promesa, no el objeto de promesa original. Este nuevo objeto de promesa nuevo puede entenderse como una vista del objeto de promesa original. Solo contiene un conjunto de métodos del objeto de promesa original. Estos métodos solo pueden observar el estado del objeto de promesa original, pero no pueden cambiar el estado interno del objeto diferido. Esto puede evitar conflictos entre múltiples personas que llaman, lo que puede cambiar el estado del nuevo objeto de promesa sin afectar a otras personas que llaman.
Además, Promise proporciona dos interfaces que implementan las transiciones de estado de la resolución (estado de implementación de inacabado a completado) y rechazar (estado de implementación de inacabado a rechazar o fallarse).
Envíe una foto para ayudar a comprender:
Con Promise, puede escribir una lógica asíncrona con una mentalidad sincrónica. En las funciones asincrónicas, no puede usar pruebas/capturas para atrapar excepciones, y no puede arrojar excepciones. Con Promise, podemos definir explícitamente explícitamente un Handler de error, que es equivalente a capturar excepciones.
Las siguientes son varias bibliotecas de clase que siguen las promesas/a especificaciones, cuando, q, rsvp.js, jQuery.deferred, etc.