2014-12-25 4 views
2

Я хочу сделать значение на HTML-странице, которая будет обновляться каждые 5 секунд, чтобы не перегружать сервер. Оказывается, что setTimeout() внутри моей функции не задерживается должным образом, но вместо этого вызывается немедленно. Может кто-нибудь помочь мне найти ключ? Я действительно не хочу, чтобы мой сервер работал слишком много, потому что мне нужно реализовать намного больше AJAX.setTimeout вызывает функцию немедленно, а не после задержки

Вот код:

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); 
     } 
    } 
} 
+0

Возможный дубликат [Вызов setTimeout в цикле не работает должным образом] (http://stackoverflow.com/questions/19714453/calling-settimeout-in-a-loop-not-working-as-expected) –

+0

Также http://stackoverflow.com/questions/15682524/settimeout-in-nodejs-loop и несколько других вопросов. –

+0

@torazaburo: Ни один из них не является точно каноническим. Возможно, этого и не может быть, но я думаю, что теперь это довольно приличная форма, которую нужно обмануть, хотя любые дополнительные настройки, вероятно, все же будут полезны. –

ответ

2

Функция объект в JavaScript, это одно. Функция звонок - это совсем другая вещь. Вы используете последний, включив круглые скобки после имени функции *, но вам нужен первый, без круглых скобок. Это позволяет setTimeout, чтобы позднее вызвать эту функцию, используя переданный объект. Предполагая, что вы на самом деле хотите, 5 секунд (а не 50 секунд исходный код использовал):

setTimeout(GetUsersNumber, 5000); 

* Действительно, любая старая переменная, которая содержит функциональный объект может быть вызван, как это, но для удобства, определение функции также определяет имя переменной для нее.

3

SetTimeout принимает функцию в качестве параметра. То, что вы делаете, сразу же выполняет функцию и передает возвращаемое значение функции exected. Пропуск GetUsersNumber вместо GetUsersNumber().() уже выполнит эту функцию.

setTimeout(GetUsersNumber, 50000); 

На стороне записки:

  • Большинство современных браузеров поддерживают XMLHttpRequest изначально. Таким образом, использование ActiveXObject не требуется.
  • Для старых браузеров условие if в любом случае даст ошибку. Сделайте это: if(window.XMLHttpRequest)
Смежные вопросы