Привет, это потому, что вы уже вызываете requestAnimationFrame()
в своем коде draw()
.Следовательно, функция уже рекурсивна.Вызывая draw
AND requestAnimationFrame(draw)
, вы вызываете 2 бесконечно рекурсивные функции одновременно.Просто удалите draw()
, и он будет работать:
const draw = (canva, context) => {
console.log('localVideoRef', localVideoRef)
context.drawImage(localVideoRef.current, 0, 0, canva.clientWidth, canva.clientHeight);
console.log('context draw', context)
requestAnimationFrame( (timestamp)=>draw(canva, context) ); // EDITED AS PER @Nicholas' answer.
}
const handleRecord = () => {
const canva = document.createElement('canvas');
canva.id = "canvas";
const context = canva.getContext("2d");
canva.width = canva.clientWidth;
canva.width = canva.clientHeight;
console.log('canva', context, canva);
console.log('room', room);
//draw(canva, context); //just remove this line
requestAnimationFrame( (timestamp)=>draw(canva, context) ) // EDITED AS PER @Nicholas' answer.
console.log('canva after drawing image', canva);
}
Проверьте документацию для получения более подробной информации о requestAnimationFrame
.Обратите внимание, что в их, например, requestAnimationFrame(step)
вызывается, но step()
не вызывается.
Обновление: Как указывал @Nicholas, вам нужно обернуть свою функцию рисования в другую функцию,Это показано выше.
Что касается , почему вызывает ошибку maximum call size exceeded
, я на самом деле немного запутался.Когда я тестировал неисправный код на консоли Chrome, вместо этого я получил эту ошибку:
Uncaught TypeError: Не удалось выполнить «requestAnimationFrame» в «Window»: обратный вызов, предоставленный в качестве параметра 1, не является функцией.
Это действительно правильно в теории.Думайте о requestAnimationFrame
как о чем-то похожем на setTimeout
.setTimeout
использует обратный вызов как setTimeout(callback, time);
;так же requestAnimationFrame
.
Когда вы передаете requestAnimationFrame( draw(canva, context) )
, вы в основном указываете функции requestAnimationFrame сделать что-то вроде draw(canva, context)()
где-то в своем коде, а не draw(canva, context)
как (Я думаю) вы ожидаете.Следовательно, он выдает ошибку callback provided is not a function
на моей консоли Chrome.
Но что касается ошибки max call stack exceeded
, я думаю, что ваш движок / компилятор JavaScript requestAnimationFrame
перехватывает ошибку, игнорирует ее,и затем переходит к вызову функции отрисовки, как .Таким образом, это, в основном, означает:
draw = (canva, context)=>{
...
draw(canva, context) //oh noes
}
Теперь это в основном бесконечно работающая рекурсивная функция .Следовательно, maximum call stack exceeded
ошибка.