Hay un problema clásico con setInterval() en los navegadores: si algún código JS u otro proceso del navegador tarda demasiado en completarse, es posible que se "respalden" varias invocaciones de devolución de llamada y de repente terminas con tu devolución de llamada ejecutada varias veces en rápida sucesión.
A menudo esto no es lo que se desea cuando se usa setInterval() . Es un caso de uso típico cuando desea que AL MENOS algún intervalo de tiempo pase entre invocaciones. La solución a esto es usar setTimeout() en su lugar y solo programar la próxima invocación cuando se complete la anterior.
Esto funciona bien, pero también es un código adicional y puede resultar confuso para alguien que no entiende el problema.
Sé que NodeJS funciona de manera diferente a los navegadores, pero no puedo encontrar información sobre este aspecto en particular. ¿NodeJS también muestra el mismo comportamiento o garantiza un tiempo mínimo entre invocaciones cuando se usa setInterval() ?
Lo parece.
start = () => { console.log(Date.now(), 'interval started'); setInterval(() => console.log(Date.now(), '-'), 1000); } busy = (n) => { console.log(Date.now(), 'busy started'); for (let i = 1; i < n; i++) Math.sqrt(i, 7); console.log(Date.now(), 'busy done'); } start(); busy(1e10); // this takes a while; nothing is printed, because this keeps the node.js thread busyProducción:
1642469880773 interval started 1642469880776 busy started 1642469888272 busy done 1642469888272 - 1642469889273 - 1642469890274 -Tenga en cuenta la larga brecha entre el inicio ocupado y el hecho, y cómo parece que no se produce una acumulación de devoluciones de llamadas de intervalo.