El principio de saync espera

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
Inserte la descripción de la imagen aquí
mire el gráfico de resultados El
Inserte la descripción de la imagen aquí
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)

Inserte la descripción de la imagen aquí
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,Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
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 Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
. Se detiene después de la segunda parte, y luego de agregar try catch
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
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.
Inserte la descripción de la imagen aquí

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,
Inserte la descripción de la imagen aquí
pero no imprimirá el último paso, porque no continuó el siguiente, podemos ver el resultado del siguiente. Inserte la descripción de la imagen aquí
El valor devuelto es la Promesa devuelta por A.
Luego, cuando Continúe a continuación, podemos
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí
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
Inserte la descripción de la imagen aquí
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.
Inserte la descripción de la imagen aquí
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
Inserte la descripción de la imagen aquí
de estas operaciones
Inserte la descripción de la imagen aquí
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 .

función asíncrona B () {espera ...} B () 相当于 autoNext ((función * BB () {rendimiento ...}) ())
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.

Supongo que te gusta

Origin blog.csdn.net/lin_fightin/article/details/114162764
Recomendado
Clasificación