ItsEvilTime
@ItsEvilTime
Сайленсер не дает мне покоя

Как повторно вызвать requestAnimationFrame?

Допустим, есть такой код:
requestAnimationFrame(function measure(time) {
    alert();
})

И где-то есть кнопка, по нажатию на которую функция вызывает данный код.
Все работает отлично. Несколько раз нажимаю на кнопку - несколько раз вылетает alert.

Но если сделать небольшую замену:
requestAnimationFrame( measure = function(time) {
    alert();
})

то при многократном нажатии на кнопку функция сработает только один раз.

Я попробовал вынести функцию отдельно и вызвать ее через call:
requestAnimationFrame( measure.call() )
выходит ошибка: The callback provided as parameter 1 is not a function

Вопрос: если мне нужна именно запись вида measure = function(time), как переписать так, чтобы функция срабатывала многократно?

P.S. Полный код, брал с сайта javascript.ru. В нем описанная проблема на третьей строке с функцией animate:
function animate(options) {
  var start = performance.now();
  requestAnimationFrame( function animate(time) {
    var timeFraction = (time - start) / options.duration;
    if (timeFraction > 1) timeFraction = 1;
    var progress = options.timing(timeFraction)
    options.draw(progress);

    if (timeFraction < 1) {
      requestAnimationFrame(animate);
    }

  });
}

P.P.S. самый полный код на JSFiddle: https://jsfiddle.net/bafxwmdf/ (проблема на девятой строке)
  • Вопрос задан
  • 571 просмотр
Решения вопроса 1
@wittyrider
systemd есть людей
Как повторно вызвать requestAnimationFrame?

// Запустит цикл
let drawId = requestAnimationFrame(time => {
    // do something
    requestAnimationFrame(time)
})

// остановит цикл
cancelAnimationFrame(drawId)


Допустим, есть такой код:

Не надо использовать requestAnimationFrame для такой задачи.

P.S. Полный код, брал с сайта javascript.ru.

У вас лишная функция.
function animate(options) {
  var start = performance.now();
  var timeFraction = (time - start) / options.duration;
  if (timeFraction > 1) timeFraction = 1;
  var progress = options.timing(timeFraction)
  options.draw(progress);
  if (timeFraction < 1) {
    requestAnimationFrame(animate);
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы