javascript - que - Chrome: los tiempos de espera/intervalo suspendidos en las pestañas de fondo?
como hacer que las paginas carguen mas rapido en google chrome (4)
Estaba probando la precisión de setTimeout
usando esta prueba . Ahora me di cuenta de que (como era de esperar) setTimeout
no es muy preciso, pero para la mayoría de los dispositivos no es demasiado impreciso. Ahora si ejecuto la prueba en Chrome y la dejo ejecutar en una pestaña de fondo (por lo tanto, cambiando a otra pestaña y navegando allí), volviendo a la prueba e inspeccionando los resultados (si la prueba finalizó) se cambian drásticamente. Parece que los tiempos de espera han sido mucho más lentos. Probado en FF4 o IE9 esto no ocurrió.
Parece que Chrome suspende o al menos ralentiza la ejecución de JavaScript en una pestaña que no tiene foco. No pude encontrar mucho en la red sobre el tema. Significaría que no podemos ejecutar tareas en segundo plano, como por ejemplo verificar periódicamente en un servidor usando llamadas XHR y setInterval
(sospecho que veo el mismo comportamiento para setInterval
, escribiré una prueba si tengo tiempo).
¿Alguien ha encontrado esto? ¿Habría alguna solución para esta suspensión / ralentización? ¿Lo llamarías un error y debería archivarlo como tal?
Actualicé mi núcleo de jQuery a 1.9.1 y resolvió la discrepancia de intervalo en pestañas inactivas. Lo probaría primero, luego buscaría otras opciones de anulación de código.
Existe una solución para usar Web Workers, ya que se ejecutan en un proceso separado y no se ralentizan.
He escrito una pequeña secuencia de comandos que se puede utilizar sin cambios en el código: simplemente anula las funciones setTimeout, clearTimeout, setInterval, clearInterval
Solo inclúyelo antes de todo tu código
Hace poco pregunté sobre esto y es el comportamiento por diseño. Cuando una pestaña está inactiva, solo se llama a la función como máximo una vez por segundo. Aquí está el cambio de código .
Quizás esto ayude: ¿Cómo puedo hacer que setInterval también funcione cuando una pestaña está inactiva en Chrome?
TL; DR: utilice Web Workers .
Lancé el paquete worker-interval npm, que estableceInterval y la implementación de clearInterval con Web-Workers para mantenerme activo en las pestañas inactivas de Chrome, Firefox e IE.
La mayoría de los navegadores modernos (Chrome, Firefox e IE), los intervalos (temporizadores de ventana) se bloquean para disparar no más de una vez por segundo en pestañas inactivas.
Puede encontrar más información sobre
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval