javascript function-pointers settimeout

javascript - setTimeout llama a la función inmediatamente en lugar de después del retraso



function-pointers (2)

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 retrasa 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 de función es una cosa 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 más tarde la función en sí misma utilizando el objeto pasado. Suponiendo que realmente desea 5 segundos (en lugar de los 50 segundos que estaba usando el código original):

setTimeout(GetUsersNumber, 5000);

* Realmente, cualquier variable antigua que contenga un objeto de función puede invocarse así, pero por conveniencia, la definición de 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 admiten XMLHttpRequest de forma nativa. Por lo tanto, no se requiere el uso de ActiveXObject.
  • Para navegadores más antiguos, la condición if siempre dará error. Haga esto: if(window.XMLHttpRequest)