首页 > 解决方案 > 承诺 requestAnimationFrame 是否安全?

问题描述

承诺安全requestAnimationFrame吗?

例如:

const raf = (cb) => new Promise((resolve) => 
    requestAnimationFrame(() => (cb(), resolve())))

const gameLoop = async () => { while(1) await raf(draw) }

标签: javascript

解决方案


承诺安全requestAnimationFrame吗?

是的:

function raf() {
    return new Promise(resolve => {
        requestAnimationFrame(resolve);
    });
}

例如:

const raf = (cb) => new Promise((resolve) => 
    requestAnimationFrame(() => (cb(), resolve())))

不,那个不安全。一个承诺返回函数不应该接受异步回调。绘图的东西应该在承诺链中完成,你的代码甚至在解决承诺之前就完成了,并且缺乏任何适当的错误处理。如果cb()抛出异常,你就完蛋了。

没有回调的简单方法工作得很好,因为requestAnimationFrame调度一个宏任务,并且由resolve回调调度的任何微任务在帧被实际绘制之前运行。你的代码应该是

async function gameLoop() {
    while (true) {
        await raf();
        draw();
    }
}

推荐阅读