更快的异步执行(setTimeout多种浏览器)
如果你想执行一个函数是异步的,想到的第一件事是setTimeout例如:setTimeout(功能(1S / *什么* { },1000 })
那么,如果要快速且异步地执行一个函数呢
会吗:
setTimeout(function(尽快做* / / *){ },0 }
不幸的是,为了避免UI嵌套的情况下,浏览器设置setTimeout最小执行时间,以避免setTimeout的嵌套,以及不同浏览器的最小执行时间是不同的。实际执行时间间隔测试setTimeout 0下铬约12ms。
因此,如果你想快速而异步地执行一个函数,有什么方法可以加快速度吗
首先看看浏览器方面,常见的异步执行方法是什么
setimmediate:此方法实现异步执行setTimeout 0更快的执行时间接近0ms时,只支持IE /节点。
RequestAnimationFrame:当你做动画的循环,这是常用的方法。此方法仅在浏览器刷新UI时执行。清爽的UI的频率通常是60fps,所以requestanimationframe慢于setTimeout 0一般。
除了使用异步函数之外,还有一些实现异步调用的方法。
使用消息:
onMessage方法往往是iframe通信时使用的,但如果同一窗口发送消息给本身事实上,它也与函数的异步执行相同。
例如:
Var(=函数){ }
Window.addEventListener(消息
window.postmessage(
此外,脚本标记还可以用于异步执行函数,如:
var newscript = document.createelement(脚本);
newscript.onreadystatechange =;
document.documentelement.appendchild(newscript);
添加脚本文件的执行onreadystatechange,但这种方法只能在伊江使用的浏览器。
那么谁是最快的
我测试过它。
在铬:
setimmediate:不可用。
setTimeout 0:12ms
消息:6ms
Onreadystatechange:不支持
在Chrome中,消息比setTimeout快0。
在Firefox:
setimmediate:不可用。
setTimeout 0:7ms
消息:7ms
Onreadystatechange:不支持
在Firefox中,消息和setTimeout 0在相同的速度。
IE9:
setimmediate:不可用。
setTimeout 0:11ms
消息:7ms 10ms
Onreadystatechange:2ms
在IE9的onreadystatechange的时间比其他的要快得多。
总的来说,setimmediate < < < < setTimeout readystatechange消息0 requestanimationframe
因此,我们可以简单地封装一个快速的方法来执行异步函数:
无功setzerotimeout =(函数(){()
如果(窗口。setimmediate){
/ / IE10 +版本,使用本地setimmediate
返回window.setimmediate;
}
如果(document.createelement onreadystatechange (脚本)){
返回(功能){ / *使用onreadystatechange版*