le chiamate setTimeout funzionano immediatamente anziché dopo un ritardo

Voglio fare un valore su una pagina HTML che verrà aggiornata ogni 5 secondi in modo da non sovraccaricare il server. Si scopre che setTimeout () all’interno della mia funzione non sta ritardando correttamente, ma viene chiamato immediatamente. Qualcuno può aiutarmi a trovare un indizio? Davvero non voglio dare troppo tempo al mio server perché devo implementare molto più AJAX.

Ecco il codice:

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 object funzione in JavaScript è una cosa. Una chiamata di funzione è una cosa diversa. Stai usando quest’ultimo, includendo parentesi dopo il nome della funzione *, ma hai bisogno del primo, senza parentesi. Ciò consente a setTimeout di richiamare in seguito la funzione stessa utilizzando l’object passato. Supponendo che tu voglia effettivamente 5 secondi (invece dei 50 secondi che il codice originale stava usando):

 setTimeout(GetUsersNumber, 5000); 

* In realtà, qualsiasi vecchia variabile che contiene un object funzione può essere invocata in questo modo, ma per praticità, definire una funzione definisce anche un nome di variabile per esso.

setTimeout accetta una funzione come parametro. Quello che stai facendo è eseguire la funzione immediatamente e il passaggio è il valore restituito della funzione selezionata. Passa GetUsersNumber anziché GetUsersNumber() . () eseguirà già la funzione.

 setTimeout(GetUsersNumber, 50000); 

In una nota a margine:

  • La maggior parte dei browser moderni supporta XMLHttpRequest in modo nativo. Quindi, l’uso di ActiveXObject non è richiesto.
  • Per i browser più vecchi, la condizione if restituirà comunque un errore. Fai questo: if(window.XMLHttpRequest)