javascript - 承诺 requestAnimationFrame 是否安全?
问题描述
承诺安全requestAnimationFrame
吗?
例如:
const raf = (cb) => new Promise((resolve) =>
requestAnimationFrame(() => (cb(), resolve())))
const gameLoop = async () => { while(1) await raf(draw) }
解决方案
承诺安全
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();
}
}
推荐阅读
- entity-framework - 实体框架代码优先:多个一对多
- c# - 如何使用 selenium 实现下面描述的页面对象模式 C# 代码?
- c# - 阻止 EF 添加或更新某些子实体
- javascript - How to get the value of an observable using knockout
- wordpress - How change default parent page for custom template in wordpress?
- c# - WPF 如何处理自定义集合的 CollectionChanged 事件?
- python - Scrapy 不遵循给定的请求
- android - How to retrieve file path and file name from gallery image to be used for uploading to server?
- ruby-on-rails - `test/dummy/config/application (LoadError)` when using `rails console` in a Rails engine
- python - 如何在每次迭代中仅从一个类中抽取批次