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:
- alert (timeout1)
- 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!
davy.ai
Basado en el código dado, el orden de ejecución es el siguiente:
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.