Supongamos que tengo setInterval(PostToServer, 1000);
. La función PostToServer
hace una publicación de Ajax, que puede tomar más de un segundo. Entonces, ¿qué sucede entonces: una segunda llamada se realiza mientras que la primera no ha terminado o se espera el final de la llamada antes de hacer una nueva?javascript setInterval: ¿se superponen las llamadas?
Respuesta
Las llamadas se superponen.
setInterval
asegura que las funciones se ejecutan regularmente, sin esperar el resultado anterior.
Si desea esperar la respuesta, cambie el método de intervalo a un sondeo. Cuando el tiempo haya pasado Y el servidor ya haya respondido, solicite nuevamente.
Dado que la respuesta del servidor no cambiará demasiado después de la respuesta, también puede agregar un controlador setTimeout
en la función de devolución de llamada de su método AJAX.
Javascript tiene una sola hebra (excepto para los trabajadores web HTML5 que no están implicados en este problema) con una cola de eventos. Una llamada posterior desde setInterval()
nunca comenzará hasta que se realice la llamada anterior. Solo uno puede estar activo a la vez.
Cuando se produce el intervalo de tiempo, dentro del motor JS el temporizador se dispara y se agrega un evento a la cola de eventos de JavaScript. Cuando el hilo de ejecución JS actualmente en ejecución finaliza (y no antes), el motor JS va y obtiene el siguiente evento de la cola de eventos y comienza ese hilo de la ejecución de JS. Por lo tanto, dos rutas de ejecución en JS nunca se superpondrán o continuarán al mismo tiempo. Por lo tanto, dos llamadas a funciones de setInterval() nunca se superpondrán. El segundo no comenzará hasta que el primero termine de ejecutarse.
Pero, con respecto a su pregunta, lo que esto significa es que dos intervalos de setInterval()
no se solaparán, pero si usted está haciendo una llamada AJAX asíncrona en el primer temporizador de intervalo y el inicio de la llamada ajax termina de inmediato, y el segundo intervalo se dispara antes de que la primera llamada ajax asincrónica haya disparado su función de finalización, entonces sus llamadas ajax se superpondrán o se superpondrán.
Si desea evitar que haya más de una llamada ajax en vuelo a la vez, tendrá que escribir un código para evitarlo específicamente al no ejecutar la segunda llamada ajax hasta que la anterior se complete o por omitir cualquier llamada ajax si la anterior todavía está en marcha.
Consulte this post para obtener más información sobre la cola de eventos JS y cómo funciona.
Sí, se superpone. Puede usar setTimeout
en la función PostToServer para asegurarse de que no se superponga, pero el problema es que ejecuta la solicitud y luego espera 1s y luego ejecuta la solicitud nuevamente. Por lo tanto, no se ejecuta exactamente cada segundo.
Para obtener más información, ver el vídeo de Paul irlandés: http://youtu.be/i_qE1iAmjFg?t=7m46s
- 1. node.js: setInterval() omitiendo llamadas
- 2. javascript setInterval
- 3. Javascript setInterval despejando?
- 4. JavaScript setInterval Límites?
- 5. Javascript setInterval no funciona
- 6. Javascript - Restablecer setInterval a 0
- 7. Javascript setInterval y `this` solución
- 8. matplotlib xticks etiquetas se superponen
- 9. setInterval() el comportamiento con 0 milisegundos en JavaScript
- 10. Método de actualización de llamadas vs tener un setInterval
- 11. JavaScript: ¿Cómo obtener setInterval() para comenzar ahora?
- 12. JavaScript setTimeout setInterval dentro de una función
- 13. Comprueba si se superponen dos veces
- 14. SmtpClient.SendAsync Las llamadas se cancelan automáticamente
- 15. ¿Cómo se comportan las llamadas dosync anidadas?
- 16. Destruye el setInterval anterior
- 17. ¿Cómo se pueden usar las etiquetas de mapa para dos imágenes que se superponen?
- 18. ¿Cómo se puede saber si dos comodines se superponen?
- 19. Reiniciar un setInterval() en Javascript/jQuery (sin clearInterval)
- 20. ¿Qué tan caras son las llamadas a funciones en JavaScript?
- 21. La función no se define en setInterval
- 22. iOS 6 safari, setInterval no se dispara
- 23. Cómo "proteger" las llamadas AJAX?
- 24. Prevenir dos polilíneas de google maps que se superponen
- 25. ¿Cómo se puede detectar si dos expresiones regulares se superponen en las cadenas con las que pueden coincidir?
- 26. Subplots Matplotlib_adjust hspace para títulos y xlabels no se superponen?
- 27. Google map API v3 marcadores que se superponen
- 28. Secuencia óptima de compras que no se superponen
- 29. Las etiquetas X-Axis superpuestas se superponen al gráfico en sí
- 30. Internet Explorer envía la cookie incorrecta cuando las rutas se superponen
@ jfriend00 Esta respuesta es correcta. El OP pregunta si una función en 'setInterval' espera el final de la solicitud AJAX del método' setInterval' anterior, ** no ** para el final de la función en la llamada 'setInterval' anterior. –
Inicialmente leí mal la pregunta y me he retractado de mi comentario y voto negativo. Inicialmente pensé que me preguntaban si dos llamadas de devolución de llamada setInterval podrían superponerse (lo que no pueden). No vi que estaban hablando de llamadas ajax desencadenadas en un intervalo. – jfriend00