Javascript 承诺requestAnimationFrame安全吗?
允诺Javascript 承诺requestAnimationFrame安全吗?,javascript,Javascript,允诺requestAnimationFrame安全吗 例如: const raf = (cb) => new Promise((resolve) => requestAnimationFrame(() => (cb(), resolve()))) const-raf=(cb)=>新承诺((解析)=> requestAnimationFrame(()=>(cb(),resolve())) const gameLoop=async()=>{while(1)等待raf(d
requestAnimationFrame
安全吗
例如:
const raf = (cb) => new Promise((resolve) =>
requestAnimationFrame(() => (cb(), resolve())))
const-raf=(cb)=>新承诺((解析)=>
requestAnimationFrame(()=>(cb(),resolve()))
const gameLoop=async()=>{while(1)等待raf(draw)}
允诺requestAnimationFrame
安全吗
是的:
例如:
const raf = (cb) => new Promise((resolve) =>
requestAnimationFrame(() => (cb(), resolve())))
不,那个不安全。承诺返回函数不应接受异步回调。绘图工作应该在承诺链内完成,代码甚至在解析承诺之前就完成了,并且缺少任何正确的错误处理。如果cb()
抛出异常,您就完蛋了
没有回调的简单方法工作得很好,因为requestAnimationFrame
调度宏任务,而resolve
回调调度的任何微任务都会在实际绘制帧之前运行。你的代码应该是
async function gameLoop() {
while (true) {
await raf();
draw();
}
}
@trincot“请注意,这两个微任务(解析运行的微任务和绘图运行的微任务)属于同一个任务(core EcmaScript)。但由于我被否决,我将删除我的答案……”这不是我的否决票。如果你说
resolve
和draw
将在同一个微任务中运行,我愿意参与其中。关于什么,安全吗?requestAnimationFrame
是否仍能正常工作,并且draw
将在“适当”的时间运行,这种方法的缺点是什么?问题中代码的明显缺点是当draw
抛出异常时,您不会得到拒绝承诺,它只是挂起。我担心的是draw
的微任务在内部被调用(相当于。然后)会以某种方式中断requestAnimationFrame
的计时。那么微任务会阻止渲染吗?是的,当调用requestAnimationFrame
回调时,它会等待所有排队的微任务完成,然后继续绘制步骤。