javascript - mdn - setinterval php
Usando setInterval() para hacer un sondeo continuo simplista (4)
De mi comentario:
setTimeout
[docs] y siempre lo llamaría cuando se recibiera la respuesta anterior. De esta manera, evitará la posible congestión o el apilamiento de funciones o lo que quiera llamar, en caso de que una solicitud / respuesta demore más que su intervalo.
Así que algo como esto:
function refresh() {
// make Ajax call here, inside the callback call:
setTimeout(refresh, 5000);
// ...
}
// initial call, or just call refresh directly
setTimeout(refresh, 5000);
Para una aplicación web simple que necesita actualizar partes de los datos presentados al usuario en intervalos establecidos, ¿hay algún inconveniente en el uso de setInterval () para obtener un JSON desde un punto final en lugar de usar un marco de sondeo adecuado?
Por el bien del ejemplo, digamos que estoy actualizando el estado de un trabajo de procesamiento cada 5 segundos.
Puedes hacerlo así:
var i = 0, loop_length = 50, loop_speed = 100;
function loop(){
i+= 1;
/* Here is your code. Balabala...*/
if (i===loop_length) clearInterval(handler);
}
var handler = setInterval(loop, loop_speed);
Sé que esta es una pregunta antigua, pero me tropecé con ella, y en la manera de hacer cosas de pensé que podría mejorarla. Es posible que desee considerar una solución similar a la que se describe aquí, que se conoce como sondeo largo. O otra solución es WebSockets (una de las mejores implementaciones de websockets con el objetivo principal de trabajar en todos los navegadores) socket.io .
La primera solución se resume básicamente al enviar una única solicitud AJAX y esperar una respuesta antes de enviar una adicional, luego, una vez que se ha enviado la respuesta, ponga en cola la siguiente consulta.
Mientras tanto, en el backend no devuelve una respuesta hasta que cambie el estado. Por lo tanto, en su escenario, utilizaría un bucle while que continuaría hasta que el estado cambiara, y luego devolverá el estado modificado a la página. Realmente me gusta esta solución. Como lo indica la respuesta vinculada anteriormente, esto es lo que hace Facebook (o al menos lo ha hecho en el pasado).
socket.io es básicamente la jQuery de Websockets, de modo que cualquiera que sea el navegador en el que se encuentren sus usuarios, puede establecer una conexión de socket que pueda enviar datos a la página (sin realizar ninguna encuesta). Esto se acerca más a las notificaciones instantáneas de Blackberry, que, si vas por un instante, es la mejor solución.
Se puede implementar una función de encuesta simple no bloqueante en navegadores recientes utilizando Promesas:
var sleep = time => new Promise(resolve => setTimeout(resolve, time))
var poll = (promiseFn, time) => promiseFn().then(
sleep(time).then(() => poll(promiseFn, time)))
// Greet the World every second
poll(() => new Promise(() => console.log(''Hello World!'')), 1000)