网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的范文:

 

标题 更快的异步执行(setTimeout多浏览器)
范文
    如果要异步执行一个函数,我们最先想到的方法肯定会是setTimeout
    例如:setTimeout(function( /* 1s后做点什么 */){},1000}
    那如果说要最快速地异步执行一个函数呢?
    是否会是:
    1 setTimeout(function( /* 尽快做点什么 */){},0}
    可惜的是,浏览器为了避免setTimeout嵌套可能出现卡死ui线程的情况,为setTimeout设置了最小的执行时间间隔,不同浏览器的最小执行时间间隔都不一样。chrome下测试 setTimeout 0 的实际执行时间间隔大概在12ms左右。
    那么如果想最快地异步执行一个函数,有没有什么可以提速的方法呢?
    先来看看浏览器端,有哪些常用的异步执行方法
    setImmediate:该方法去实现比setTimeout 0 更快的异步执行,执行时间更接近0ms,但是只有IE/node支持。
    requestAnimationFrame:做动画循环的时候经常会用到这个方法,该方法只会在浏览器刷新ui的时候执行,刷新ui的频率最大一般为60fps,所以requestAnimationFrame一般情况下比setTimeout 0 更慢一些。
    除了使用异步函数外,还有一些方法可以实现异步调用
    利用onmessage:
    和iframe通信时常常会使用到onmessage方法,但是如果同一个window postMessage给自身,会怎样呢?其实也相当于异步执行了一个function
    例如:
    1 var doSth = function(){}
    2 window.addEventListener("message", doSth, true);
    3 window.postMessage("", "*");
    另外,还可以利用script标签,实现函数异步执行,例如:
    1 var newScript = document.createElement("script");
    2 newScript.onreadystatechange = doSth;
    3 document.documentElement.appendChild(newScript);
    把script添加到文档也会执行onreadystatechange 但是该方法只能在IE下浏览器里使用。
    那么 这几种方法,谁最快?
    测试了一下,
    chrome下:
    setImmediate:不可用。
    setTimeout 0:12ms
    onmessage:6ms
    onreadystatechange:不支持
    chrome下,onmessage比setTimeout 0 更快。
    firefox下:
    setImmediate:不可用。
    setTimeout 0:7ms
    onmessage:7ms
    onreadystatechange:不支持
    firefox下,onmessage和setTimeout 0 速度相当。
    IE9:
    setImmediate:不可用。
    setTimeout 0:11ms
    onmessage:7ms 10ms
    onreadystatechange:2ms
    IE9下,onreadystatechange的时间比另外两者要快得多。
    总体情况下,setImmediate < readystatechange < onmessage < setTimeout 0 < requestAnimationFrame
    因此我们可以简单封装一个快速执行异步function的方法:
    01 var setZeroTimeout = (function(){
    02 if(window.setImmediate){
    03 //IE10+版本,使用原生setImmediate
    04 return window.setImmediate;
    05 }
    06 else if("onreadystatechange" in document.createElement("script")){
    07 return function(){/* 使用onreadystatechange的版本 */}
    08 }
    09 else if(window.postMessage){
    10 return function(){/* 使用onmessage的异步执行版本 */}
    11 }
    12 else {
    13 return window.setTimeout;
    14 }
    15
    16 })();
随便看

 

在线学习网范文大全提供好词好句、学习总结、工作总结、演讲稿等写作素材及范文模板,是学习及工作的有利工具。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/17 19:12:11