2016-04-14 5 views
0

Я пытаюсь понять этот код:понимание автоматического обновления страницы в JavaScript

function setIdle(cb, seconds) { 
    var timer; 
    var interval = seconds * 1000; 
    function refresh() { 
      clearInterval(timer); 
      timer = setTimeout(cb, interval); 
    }; 
    $(document).on('keypress, click', refresh); 
    refresh(); 
} 

setIdle(function() { 
    location.href = location.href; 
}, 5); 

setIdle принимает два аргумента. Внутри своей функции он имеет функцию refresh, которая очищает таймер от функции Timeout. Теперь каждый раз, когда происходит событие (click, keypress) refresh() получает вызов.

, а затем, наконец, эта функция получает вызов, передаваемый другой функцией, и значение int (5), которое позже будет количеством секунд для таймера. В этой другой функции, которая позже представлена ​​через cb, страница будет обновлена ​​(location.href = location.href;).

Это вызывает автоматическое обновление каждые 5 секунд.

Так что теперь я не понимаю, если я ставлю дополнительную функцию:

setIdle(function() { 
     console.log('hi'); 
    }, 1); 

Почему вторая функция вызывается только один раз, а не каждый второй, как другой?

+1

Возможно, вам понравится аналогичный вопрос: [Обнаружение простоя в JavaScript изящно] (http://stackoverflow.com/questions/667555/detecting-idle-time-in-javascript-elegantly). – Roberto

ответ

1

setIdle не запускает функцию обратного вызова каждые 5 секунд. Он запускает его один раз, через 5 секунд после того, как вы вызываете setIdle, и если вы наберете или нажмете что-то, тайм-аут снова будет отброшен. Таким образом, он запускает его один раз, когда вы простаиваете в течение 5 секунд.

Причина, по которой страница обновляется каждые 5 секунд, заключается в том, что функция обратного вызова перезагружает страницу, а перезагрузка страницы снова запускает весь Javascript на странице, чтобы снова звонить setIdle().

Но ваше второе использование setIdle не перезагружает страницу, поэтому оно просто регистрирует hi один раз.

Если вы хотите что-то делать раз в несколько секунд, используйте setInterval, а не setTimeout.

BTW, clearInterval должно быть clearTimeout. В большинстве браузеров они в настоящее время взаимозаменяемы, но нет никакой гарантии. См. Are clearTimeout and clearInterval the same?

+0

Вижу, спасибо! – Tom

Смежные вопросы