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
回调时,它会等待所有排队的微任务完成,然后继续绘制步骤。