Las llamadas setTimeout funcionan inmediatamente en lugar de después de un retraso

Resuelto DualCore asked hace 9 años • 2 respuestas

Quiero crear 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 inmediatamente. ¿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);
        }
    }
}
DualCore avatar Dec 25 '14 09:12 DualCore
Aceptado

Un objeto de función en JavaScript es una cosa. Una llamada a función es algo diferente. Estás usando este último, al incluir paréntesis después del nombre de la función*, pero necesitas el primero, sin paréntesis. Esto permite setTimeoutinvocar posteriormente la función misma utilizando el objeto pasado. Suponiendo que realmente desea 5 segundos (en lugar de los 50 segundos que usaba el código original):

setTimeout(GetUsersNumber, 5000);

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

Nathan Tuggy avatar Dec 25 '2014 02:12 Nathan Tuggy

setTimeout toma una función como parámetro. Lo que está haciendo es ejecutar la función de inmediato y pasar el valor devuelto de la función ejecutada. Pase GetUsersNumberen 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 es necesario utilizar ActiveXObject.
  • Para navegadores más antiguos, la condición if dará error de todos modos. Hacer esto:if(window.XMLHttpRequest)
gp. avatar Dec 25 '2014 02:12 gp.