更快的异步执行(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版*