2012-02-09 12 views
11

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

7

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.

+0

@ 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. –

+1

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

8

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.

1

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

Cuestiones relacionadas