mientras (verdadero) vs setInterval (función (), 0) [duplicate]

5 minutos de lectura

Avatar de usuario de Ali Bassam
ali bassam

establecerIntervalo()

Llama a una función o ejecuta un fragmento de código repetidamente, con un retraso de tiempo fijo entre cada llamada a esa función.

tiempo()

Crea un ciclo que ejecuta una declaración específica siempre que la condición de prueba se evalúe como verdadera. La condición se evalúa antes de ejecutar la instrucción.

si uso while(true) para ejecutar una declaración específica, mi navegador falla (Firefox), retrasos (Ópera), o la instrucción no se ejecutará (Cromo), pero si utilizo setInterval() con un tiempo fijo de 0 segundostodo funciona perfectamente, aunque solo son 0 segundos, y while(true) lógicamente no puede ser más rápido que 0 segundos, pero ¿por qué sucede esto?

tiempo() ejemplo:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            while (true)
            {
                document.getElementById("counter").innerHTML += i++; 
            }
        </script>
    </body>
</html>

establecerIntervalo() ejemplo:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            setInterval(function() { counter() }, 0);
            function counter()
            {
               document.getElementById("counter").innerHTML += i++;
            }
        </script>
    </body>
</html>

Hay una gran diferencia que implica el bloqueo. El primer enfoque, el while loop bloqueará la CPU del usuario porque se ejecuta para siempre sin detenerse y ocupará el 100% del procesador. setInterval en realidad tiene una cantidad mínima que está implícita y depende del navegador. Creo que es alrededor de 10 ms. Entonces tus setInterval en realidad solo se ejecuta durante un milisegundo más o menos haciendo esa actualización simple, una vez cada 10 ms. Esto es duro para el procesador, pero no requerirá el 100% del procesador y puede mitigarse con la administración de tareas por parte del sistema operativo.

avatar de usuario de fresskoma
freskoma

  • while(1) genera un bucle infinito, es decir, JavaScript simplemente se ejecutará para siempre y nunca devuelve el control al navegador, que por lo tanto se congela, porque no puede hacer nada más nunca más (hasta que se elimina el script).

  • setTimeout(func, 0) se comporta de manera diferente en el sentido de que después de ejecutarse, el control vuelve al navegador, que puede decidir qué hacer después. Configuración de 0ms en setTimeout no garantiza que el código JavaScript se ejecuta directamente después de que se detiene. Con el parámetro 0ms simplemente le dice al navegador que le gustaría que el código se ejecute directamente después de que se detenga, pero el navegador es libre de hacer otra cosa antes de hacerlo.

  • probablemente te refieres while(1).

    – el sistema

    12 de febrero de 2013 a las 20:03

  • De hecho lo hago 😀

    – freskoma

    12 de febrero de 2013 a las 20:06

Avatar de usuario de Frances McMullin
Frances McMullin

Javascript en los navegadores es rosca simple y evento conducido. No hay dos cosas que se ejecuten al mismo tiempo, nunca, y el ciclo de eventos es el rey. Si su JS nunca cede el control del hilo único (finalizando una función), entonces nada más puede usar el hilo. El mismo subproceso maneja JS y DOM, por lo que el usuario ni siquiera puede desplazarse o hacer clic en nada si su JS está acaparando el subproceso.

setInterval (o de hecho setTimeout) con un retraso de 0 (milisegundos, no segundos) solo significa agregar esta función a la cola de eventos después del retraso dado, no hay garantía de que la función se ejecute en ese momento exacto.

EDITAR: en realidad, los trabajadores web pueden ejecutar JS al mismo tiempo que el hilo del navegador principal, pero no ven la misma memoria/no pueden acceder al DOM, por lo que los puntos/suposiciones anteriores aún se mantienen, más o menos. .. Si desea ingresar a los trabajadores web, querrá una buena comprensión de JS / programación funcional.

EDITAR (otra vez): ¿Por qué quieres hacer un bucle para siempre? Si está votando (la única razón que se me ocurre), no lo haga. Casi siempre hay una mejor manera, especialmente en JS. La forma funcional es definir la función que desea ejecutar cuando ocurre un evento (lo que estaba buscando) y luego adjuntar esa función al evento (cómo hacer esto depende del evento).

  • Nit: Agregué “en los navegadores”. La especificación ECMAScript no excluye exclusivamente la creación de subprocesos.

    usuario166390

    12 de febrero de 2013 a las 19:57


  • @pst, muy bien, gracias =)

    – Frances McMullin

    12 de febrero de 2013 a las 20:03

  • el “agregar evento a la cola después del retraso dado” finalmente me hizo entender. esta debe ser la mejor respuesta

    – Drakonli

    29 de septiembre de 2020 a las 8:15

while(true) bloqueará cualquier ejecución hasta que finalice el ciclo condicional, lo que ya sabemos que nunca sucederá. (Cromo)

setInterval le dice al entorno que ejecute código arbitrario cada x milisegundos, no bloqueará su navegador porque el “programador” todavía tiene el control.

¿Tiene alguna razón en particular para usar un ciclo interminable e incluso manipular el DOM con cada paso?

Si usas el while loop, lo más probable es que bloquee el navegador y el cliente por completo, lo que también provocará una posible sobrecarga de la CPU si no se finaliza de alguna manera.

El lazo while trata de terminar su trabajo en la mayor cantidad posible de microsegundos. Entonces puede incluso intentar ejecutar un millón de pasos en un posible segundo, y tal vez incluso más, en este caso depende del cliente. Sin embargo, a tal velocidad no sería posible actualizar el DOM.

en el caso de setIntervales bastante diferente de while bucle, de hecho, es más apropiado llamarlo un function repeater. Repite la función dada después de que pasa el tiempo dado. Entonces, incluso si el tiempo es 0, tiene un paso en el que verifica if the waiting time has passed now, and should the next repeat be run.

Así que puedes considerar while loop más instantáneo que de 0 segundos de retraso.

  • Sí, necesito ejecutar alertas en tiempo real para valores que siguen cambiando, verificar alertas, ejecutar nuevamente, ejecutar nuevamente e ir infinitamente

    – Aplicación pirata

    11 de octubre de 2018 a las 14:18

  • Sí, necesito ejecutar alertas en tiempo real para valores que siguen cambiando, verificar alertas, ejecutar nuevamente, ejecutar nuevamente e ir infinitamente

    – Aplicación pirata

    11 de octubre de 2018 a las 14:18

¿Ha sido útil esta solución?