Prefacio
Antes de async await, usamos Promise para resolver devoluciones de llamada infernales asincrónicas. El principio se establece en mi blog anterior. Después de ES7, async y await salieron para resolver devoluciones de llamada, la versión definitiva.
¿Por qué dices eso? Porque el uso es extremadamente simple. Primero mire el
uso básico: luego
mire el gráfico de resultados El
segundo paso es reducir la velocidad por un tiempo y luego imprimirlo.
Se puede ver que cuando se ejecuta la función BB, la sincronización es de ejecución directa, como el primer paso, y luego se encuentra en espera, luego en espera afectará la ejecución del código detrás de ella, pero no afectará la ejecución de la sincronización. afuera, para que pueda ver, después del primer paso, se ejecuta directamente Estoy afuera, y luego se ejecuta después de esperar, en realidad hay un pequeño agujero aquí,
(suplemento)
Si está escrito así, si no se usa setTimeout, primero ejecutará await A () antes de ejecutar el código de sincronización externo y luego ejecutará el código detrás de awati, como se muestra en la figura
por qué, mire hacia atrás, porque en realidad await llama a .then () cuando se ejecuta Después de terminar, ejecuta el código detrás de await en .then. Es equivalente a poner console.log (3). Luego, se convierte en una micro tarea, por lo que el código externo se ejecutará primero. Puede buscar más detalles.
Debido a que no escribí resolver o rechazar para cambiar el estado de la Promesa, el código de abajo await no se ejecutó. Await estaba esperando que se completara la Promesa, pero el estado de Pormise era Pendiente, así que me detuve allí. Modifique el código en este momento,
Puede ver que puede funcionar con normalidad.
Por cierto, también lo pregunté en la entrevista, es decir, al rechazar al rechazar, no se agota
. Se detiene después de la segunda parte, y luego de agregar try catch
No se informará ningún error, pero tampoco se agotará.
principio asincrónico
De hecho, async = generador + generador de autoejecutor
generador. Creo que deberías tener un conocimiento básico. Si no lo entiendes, puedes ir al tutorial para principiantes.
Usemos el generador para implementar nuestra operación asincrónica.
Lu Xia pensó que después de esperar b.next () normalmente, imprimiría el primer paso y luego encontraría yeild seguido de la función asincrónica, porque se ha detenido aquí, por lo que continuará ejecutando el código de la función asincrónica A . Imprimirá 2, como se muestra en la figura,
pero no imprimirá el último paso, porque no continuó el siguiente, podemos ver el resultado del siguiente.
El valor devuelto es la Promesa devuelta por A.
Luego, cuando Continúe a continuación, podemos
ver claramente, él El último paso se ejecuta primero, y luego se ejecuta la promesa en la promesa. ¿Por qué? Porque sus dos próximos pasos consecutivos en realidad se consideran operaciones síncronas. Después de ejecutar un siguiente, el siguiente se ejecutará inmediatamente y setTimeout se coloca en la cola de tareas para que se ejecute después de que se complete la sincronización. Solución:
debido a que el primer rendimiento devuelve una Promesa, podemos llamar a la función then. Cuando llamamos a then, significa que la caminata asincrónica ha terminado, por lo que una vez finalizada la caminata, llamamos a b.next () para continuar caminando, la resultado
Como puede ver, esto resuelve la asincronía. Pero este tipo de idea es demasiado complicada, no es tan buena como la Promesa directa, por lo que hay un ejecutor automático.
Lo que es un ejecutor automático, es decir, nos ayuda automáticamente a detectar si el generador puede continuar atravesando, si es posible, procesar entonces y continuar llamando a continuación hasta que no se pueda atravesar.
Usando la recursividad, cuando todavía podemos atravesar hecho, demostramos que podemos continuar el recorrido. Aquí, asumiendo que el rendimiento es seguido por Promise, entonces podemos procesar entonces y continuar la recursividad.
Mira el efecto. Los resultados
de estas operaciones
son los mismos.
De hecho , es casi el mismo que cuando usamos async. Await es rendimiento. Después de la ejecución de yeild, se requiere PROMISE, o después de await, PROMISE se ejecutará hacia abajo .
Por supuesto, en la situación real, hay otras cosas detrás del rendimiento, por lo que este método es solo para que usted comprenda async.