I'm trying to cancel a requestAnimationFrame
loop, but I can't do it because each time requestAnimationFrame
is called, a new timer ID is returned, but I only have access to the return value of the first call to requestAnimationFrame
.
Specifically, my code is like this, which I don't think is entirely uncommon:
function animate(elem) {
var step = function (timestamp) {
//Do some stuff here.
if (progressedTime < totalTime) {
return requestAnimationFrame(step); //This return value seems useless.
}
};
return requestAnimationFrame(step);
}
//Elsewhere in the code, not in the global namespace.
var timerId = animate(elem);
//A second or two later, before the animation is over.
cancelAnimationFrame(timerId); //Doesn't work!
Because all subsequent calls to requestAnimationFrame
are within the step
function, I don't have access to the returned timer ID in the event that I want to call cancelAnimationFrame
.
Looking at the way Mozilla (and apparently others do it), it looks like they declare a global variable in their code (myReq
in the Mozilla code), and then assign the return value of each call to requestAnimationFrame
to that variable so that it can be used any time for cancelAnimationFrame
.
Is there any way to do this without declaring a global variable?
Thank you.