Это правда, что id, который возвращает requestAnimationFrame, постоянно увеличивается на единицу, но это не имеет значения.Чтобы сохранить запрос «живым», вам необходимо повторно запросить его внутри обратного вызова.Давайте посмотрим, что произойдет в последний раз при выполнении шага функции обратного вызова:
function step(timestamp) {
console.log("before " + rafId);
rafId = requestAnimationFrame(step);
console.log("after " + rafId);
if (timestamp >= 1000) {
cancelAnimationFrame(rafId);
}
}
rafId = requestAnimationFrame(step);
, если вы посмотрите на две последние строки в консоли, это будет что-то вроде:
до 50
после 51
Это означает, что идентификатор, возвращенный из последнего обратного вызова, был 50, и теперь мы запрашиваем новый анимационный кадр, который получает идентификатор 51.На этот раз наше условие if истинно, поэтому он отменяет запрос идентификатора 51. Запрос идентификатора 50 завершен, поскольку была вызвана функция обратного вызова, поэтому отменить его не нужно.