The function to render my canvas is a prototyped method of a class, like this:
Engine.prototype.renderCameras = function() {
console.log('render ok');
}
When I try to run this code directly, it works fine:
engine.renderCameras()
>>> render ok
When I try to run it using requestAnimationFrame, in either Chrome or Firefox, I get this:
window.requestAnimFrame(engine.renderCameras())
>>> render ok
>>> Error: Component returned failure code: 0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS) [nsIDOMWindow.mozRequestAnimationFrame]
It runs, but it always throws an error. That’s not cool.
When I try to run it like this:
window.requestAnimFrame(engine.renderCameras)
>>> 0
It just does nothing.
I was able to solve this problem by using a closure, but I’d still like to know why I can’t pass a function like that to requestAnimationFrame.
is not passing a function to
requestAnimFrame, it is passing the return value ofengine.renderCamerastorequestAnimFrame. The return value is probably not a function and that’s why you get this error.instead correctly passes a function reference, but then
this[docs] insiderenderCameraswon’t refer toengine. If you rely on that (which I assume based on the setup), you either have to pass a function callingengine.renderCamerasproperly:or use
.bind[docs] to set (and bind)thisexplicitly:Either way, you have to repeatedly call
window.requestAnimFrameto get the next animation frame, which means you typically use a recursive function. For example: