setTimeout llama a la función inmediatamente en lugar de después de la demora

Quiero hacer un valor en una página HTML que se actualizará cada 5 segundos para no abrumar al servidor. Resulta que setTimeout () dentro de mi función no se está retrasando correctamente, sino que se llama de inmediato. ¿Alguien puede ayudarme a encontrar una pista? Realmente no quiero darle demasiado trabajo a mi servidor porque tengo que implementar mucho más AJAX.

Aquí está el código:

window.onload = function GetUsersNumber() { aside = document.getElementById("users"); if (XMLHttpRequest) var x = new XMLHttpRequest(); else var x = new ActiveXObject("Microsoft.XMLHTTP"); x.open("GET", "users_count.php", true); x.send(); x.onreadystatechange = function () { if (x.readyState == 4) { if (x.status == 200) aside.innerHTML = x.responseText; setTimeout(GetUsersNumber(), 50000); } } } 

Un objeto de función en JavaScript es una cosa. Una llamada a función es algo diferente. Está utilizando el último, incluyendo paréntesis después del nombre de la función *, pero necesita el primero, sin paréntesis. Esto permite que setTimeout invoque posteriormente la función utilizando el objeto transferido. Suponiendo que realmente desea 5 segundos (en lugar de los 50 segundos que el código original estaba usando):

 setTimeout(GetUsersNumber, 5000); 

* En realidad, cualquier variable antigua que contenga un objeto de función se puede invocar así, pero, por comodidad, definir una función también define un nombre de variable para ella.

setTimeout toma una función como parámetro. Lo que está haciendo es ejecutar la función de inmediato y pasar es el valor devuelto de la función ejecutada. Pase GetUsersNumber lugar de GetUsersNumber() . () ya ejecutará la función.

 setTimeout(GetUsersNumber, 50000); 

En otros comentarios:

  • La mayoría de los navegadores modernos son compatibles con XMLHttpRequest de forma nativa. Por lo tanto, no se requiere el uso de ActiveXObject.
  • Para los navegadores más antiguos, la condición if siempre dará error. Haga esto: if(window.XMLHttpRequest)