【发布时间】:2021-01-13 10:05:23
【问题描述】:
我做了一个“睡眠”定时器函数,它递归调用 requestAnimationFrame 并在时间用完后返回一个 promise。我使用 requestAnimationFrame 是否有任何性能优势,或者我应该只使用 setTimeout?我知道 requestAnimationFrame 在非常短/快速的等待时间(也称为动画帧)上具有更好的性能,但是对于接近或超过一秒的等待时间,它有什么不同吗?
var sleep = (time) =>{
var timer = (t, s, d, r)=>{
if(t - s > d){
r("done")
} else {
requestAnimationFrame((newT)=>{ timer(newT, s, d, r)})
}
}
return new Promise((r)=>{
requestAnimationFrame((t)=>{timer(t, t, time, r)})
})
}
(async ()=>{
var message = document.getElementById("message")
while(message){
message.innerText = "Get"
await sleep(1000)
message.innerText = message.innerText + " Ready"
await sleep(1000)
message.innerText = message.innerText + " To"
await sleep(1000)
message.innerText = message.innerText + " Wait"
await sleep(1000)
}
})()
<p style="text-align:center; font-size:20px;" id="message"></p>
【问题讨论】:
-
是的,您绝对应该使用
setTimeout,它用于计时(包括睡眠)而不是用于动画。requestAnimationFrame解决方案的性能要差得多,因为您必须重复调用它,从而降低您的函数效率。 -
很高兴知道。谢谢!
标签: javascript timer async-await settimeout requestanimationframe