Что делает рекурсивный вызов requestAnimationFrame?

Что делает requestAnimationFrame в этом блоке кода?

  tick() {
    if (this.running) {
      this.remaining = Math.max(0, this.end - Date.now());
      requestAnimationFrame(() => this.tick());
    }
  }

Другими словами, в чем будет разница между приведенным выше кодом и вызовом this.tick() вне requestAnimationFrame():

tick() {
    if (this.running) {
      this.remaining = Math.max(0, this.end - Date.now());
      this.tick()
    }
}

Для справки: этот пример кода взят из примера таймера веб-компонента What is Lit.

Он будет ждать следующего события рисования, чтобы снова вызвать функцию галочки. Без этого он просто заблокирует основной интерфейс, пока не произойдет переполнение стека.

jontro 02.06.2024 21:22

Второй пример — чистая рекурсия, но в первом вызовы происходят асинхронно, поскольку requestAnimationFrame вызывает обратный вызов перед следующей перерисовкой. Он вызывается в рекурсивной форме для создания эффекта анимации, поскольку обратный вызов вызывается только один раз. Ссылка: Developer.mozilla.org/en-US/docs/Web/API/Window/…

Danny 02.06.2024 21:22

Есть ли способ... "Визуализации".... с течением времени... это каким-то образом...?

Ole 02.06.2024 21:40

Вы можете создать с его помощью базовую анимацию, чтобы увидеть ее в действии. По сути, она запускает функцию 60 раз в секунду. Именно так вы бы анимировали в <canvas> вместо использования таких хакерских вещей, как setTimeout.

Danny 02.06.2024 21:46

Таким образом, перенос this.tick() в requestAnimationFrame замедляет скорость вызова this.tick()... Итак, каким-то образом... браузер определяет... когда должно произойти следующее событие отрисовки... и планирует следующий вызов тика... ? Есть ли более «точный» способ описать это?

Ole 02.06.2024 22:01

Документация есть по запросу AnimationFrame . Там описывается расписание и когда...

trincot 02.06.2024 22:03

Хорошо... В общем... если частота обновления составляет 60 Гц... Или 60 циклов в секунду... именно столько раз будет вызываться обратный вызов tick(), каждую секунду, пока анимация не завершится... и мы сделал ли это за пределами того, чтобы он вызывался с гораздо большей частотой... ?

Ole 02.06.2024 22:14

Джейк Арчибальд сделал хорошее видео (с анимацией цикла событий): youtube.com/watch?v=cCOL7MC4Pl0

Danny '365CSI' Engelman 03.06.2024 10:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование рекурсии без setTimeout или requestAnimationFrame просто блокирует поток и зависает браузер. requestAnimationFrame планирует обратный вызов непосредственно перед перерисовкой обновленного DOM, и вы можете измерить FPS следующим образом:

let running = false;
let start1;
let counter = 0;
function tick() {
  if (running === false) return;
    counter++;
    $text.textContent = Math.round(1000/(performance.now()-start1)*counter) + 'Hz'
    requestAnimationFrame(tick);
}
function start() {
  if (running) return;
  running = true;
  counter = 0;
  start1 = performance.now();
  tick();
}

function stop() {
  $text.textContent = '';
  running = false
}
<button onclick = "start()">Start</button>
<button onclick = "stop()">Stop</button>
<div id = "$text"></div>

Другие вопросы по теме