Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

setImmediate兼容解决方案

  在一些库的封装中我们经常都要使用到异步,而setTimeout本身只是提供一个延迟执行而已,它并不是标准的异步解决方案,异步应该是以最快的速度在下一个消息中执行。之前的利用Promise对象可以解决Chrome的问题,那么可以考虑让其它浏览器也兼容上。
  Chrome的解决方法在之前的文章中已经介绍过了,但Firefox上暂时没有什么比其setTimeout还快的方法了,所以直接用setTimeout
  目前的IE11依然不支持Promise,不过IE10+本来就自带setImmediate方法(虽然目前也是用setTimeout模拟的),所以可以直接使用。在IE9-中,SCRIPT标签即使不指定src,默认会异步触发一次readystatechange事件,而且是异步即时触发,所以它可以作为setImmediate来使用。
<script>
var setImmediate=setImmediate||function(handle){
  var args=Array.prototype.slice.call(arguments,1);
  var invoke=function(){ handle.apply(self,args); };
  if(window.Promise)
    Promise.resolve().then(invoke);
  else if(!-[1,]){
    var head=document.documentElement.firstChild;
    var script=document.createElement("script");
    script.onreadystatechange=function(){
      script.onreadystatechange=null;
      head.removeChild(script);
      invoke();
    };
    head.appendChild(script);
  }else setTimeout(invoke);
};

var t=new Date;
setImmediate(function(){
  console.log(Date.now()-t);
});
</script>

  不过这个实现优先使用了浏览器自带的setImmediate方法,比如像最新IE的setImmediate方法就实现的很烂。当没有解决方案可用时使用setTimeout勉强兼容。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^