Если мне нужно постоянно получать новые данные, я знаю, что лучшим решением являются веб-сокеты. Таким образом, сервер будет уведомлять клиента о появлении новых данных. Но чтобы избежать этого только для одного сценария, мне нужно будет вызывать некоторый http-запрос каждые пять секунд.
Я использую здесь счетчик только для моделирования вместо вызова какой-либо службы http.
let counter = 0;
setInterval(() => {
console.info(counter);
++counter;
},5000)
Я читал, что лучшим решением является requestAnimationFrame вместо setInterval. Он более оптимизирован браузером, а также, когда вкладка не активна, она приостанавливается. Установленный интервал продолжает срабатывать, и когда вкладка не активна, это нехорошо.
Как я могу вызывать какую-то функцию в requestAnimationFrame каждые пять секунд?
Чтобы на самом деле вызывать его каждые 5 секунд, вам все равно понадобится (по крайней мере) setTimeout
. Но с этим будет работать что-то вроде следующего:
requestAnimationFrame(function run() {
console.info('do something w/o initial delay');
setTimeout(function () {
console.info('do something w/ initial delay');
requestAnimationFrame(run);
}, 5000);
});
@pece Более или менее. requestAnimationFrame
не имеет функции синхронизации, потому что обычно вы хотите вызывать ее как можно чаще, чтобы обеспечить хороший fps (~ 60). Если это не ваша цель, вам нужно обойти это и вызывать только через определенные промежутки времени. Обратите внимание, что код работает, но я, вероятно, никогда не буду использовать requestAnimationFrame
таким образом. Я бы придерживался простых setTimeout
s. По совпадению вы можете заменить requestAnimationFrame
на setTimeout
в приведенном выше коде без каких-либо изменений в поведении.
Спасибо Йоши за ваш ответ. Я принял ваш ответ, потому что он работает. Это единственный способ восстановить setTimeout?