es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El orden de ejecución de setTimeout y la función de callback onload AJAX.

Soy un traductor español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy bastante nuevo en JavaScript y después de tener una comprensión básica de cómo el bucle de eventos, la cola de devolución de llamada y las API web trabajan juntos para lograr la asincronía en JavaScript. Tengo un siguiente código simple que incluye setTimeout y AJAX para probar si mi comprensión del orden de ejecución del código es correcto o no.

setTimeout (() => {
alerta (‘timeout1’)
}, 0);
req = new XMLHttpRequest ();
req.open (“get”, “https://reqres.in/api/products/3”);
req.onload = function (datos) {
alerta (‘solicitud completada ‘+ datos.target.responseText);
};
req.send ();
alerta (‘123’);
alerta (‘456’);
alerta (‘789’);

Esperaba que el resultado fuera así:

alerta (‘123’) -> alerta (‘456’) -> alerta (‘789’) -> alerta (‘timeout1’) -> alerta (‘solicitud completada’)

Lo que pensé es que primero el setTimeout() pertenece a la API del navegador, por lo que se sacará de la pila de llamadas de JavaScript y se ejecutará fuera del motor de JavaScript, luego los scripts siguen ejecutándose en la siguiente línea de código. Como llegó a la línea req.send (), también se ejecutará fuera del motor de JavaScript y luego los scripts continúan. Y como configuré el tiempo de espera en 0 seg., La función de devolución de llamada de setTimeout () () => {alert (‘timeout1’)} deberá ingresar primero a la cola de devolución de llamada antes de la función de devolución de llamada de req.onload () function () {alert (‘solicitud completa’);} (Después de todo, la solicitud necesita tomarse algún tiempo para esperar la respuesta, incluso si es súper rápido). Por lo tanto, el orden de ejecución después de que la pila de llamadas esté vacía, sería:

  1. alert (timeout1)
  2. alert (solicitud completada)

Pero el resultado es:

alert (‘123’) -> alert (‘456’) -> alert (‘789’) -> alert (‘solicitud completa’) -> alert (‘timeout1’)

Obviamente, mi pensamiento es incorrecto. Pero simplemente no puedo entenderlo.

Por favor, corríjame si me equivoco en esto. ¡Gracias por revisar mi pregunta!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en el código dado, el orden de ejecución es el siguiente:

    1. alert(‘123’)
    2. alert(‘456’)
    3. alert(‘789’)
    4. Se envía una solicitud AJAX, lo que inicia una operación asíncrona y mueve la solicitud a la API del navegador.
    5. Se llama a setTimeout() y la función de devolución de llamada se empuja a la webAPI.
    6. Todo el código síncrono se ha ejecutado, por lo que la pila de llamadas está vacía y el ciclo de eventos verifica la cola de devolución de llamada.
    7. La solicitud AJAX recibe una respuesta y los datos de respuesta se pasan a la función de devolución de llamada especificada, que se empuja a la cola de devolución de llamada.
    8. Dado que el temporizador en setTimeout() ha caducado, la función de devolución de llamada también se empuja a la cola de devolución de llamada.
    9. El ciclo de eventos verifica la cola de devolución de llamada y recupera la primera función en la cola, que es la función de devolución de llamada de respuesta.
    10. Se ejecuta la función de devolución de llamada de respuesta y se muestra un mensaje de alerta (‘solicitud completada’ más los datos de respuesta).
    11. El ciclo de eventos recupera la segunda función de la cola de devolución de llamada, que es la función de devolución de llamada setTimeout().
    12. Se ejecuta la función de devolución de llamada setTimeout() y se muestra un mensaje de alerta (‘timeout1’).

    Por lo tanto, el orden real de ejecución es diferente del orden esperado porque las solicitudes AJAX son asíncronas y no necesariamente finalizarán antes que otras funciones. La función setTimeout() con un temporizador de 0 segundos también puede ejecutarse después de otras funciones asíncronas como AJAX.

Comments are closed.