Web 技术研究所

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

Chrome页面刷新后SharedWorker无法连接的问题

  SharedWorker进程会在所有连接断开后自动回收。但如果只有一个页面与SharedWorker进程连接,此时刷新这个页面就可能因SharedWorker进程正在回收而连接失败。然而SharedWorker并没有连接失败的事件,于是我们就得自己判断连接失败的情况,并重新连接。
  理论上SharedWorker连接失败的情况是不可能发生的,所以也没有提供相关的事件来监控。在Firefox上,同样的行为也不会造成SharedWorker连接失败,这应该属于Chrome的BUG。下面是BUG重现,测试与 Chrome37@Windows7:
//worker.js
onconnect=function(e){
  //当连接成功时候传回一个消息
  e.ports[0].postMessage("success");
};
<!--test.html-->
<script>
new SharedWorker("worker.js").port.onmessage=function(e){
  console.log(e.data);
};
</script>
  这个测试中我们通过在页面的控制台查看是否有消息输出来判断它是否连接成功。既然成功的状态可以这么判断,于是在实际使用时我们也可以通过判断连接成功时的回调消息来判断是否连接成功,并且设置一个超时,如果连接失败的话就重新发起。但既然有消息被用于检测连接成功,那就需要一个自己定义一种消息格式来区分这些专用消息和普通消息,于是我们可以这样实现:
//worker.js
onconnect=function(e){
  e.ports[0].postMessage({name:"connected"});
};
<!--test.html-->
<script>
(function callee(){
  var itv=setTimeout(function(){
    console.log("timeout!");
    callee();
  },1000);
  new SharedWorker("worker.js").port.onmessage=function(e){
    if(e.data.name=="connected")
      clearTimeout(itv),console.log("connected~");
  };
  console.log("connecting...");
})();
</script>


  虽然解决方案不太漂亮,不过至少能解决眼下的问题。如果有更好的解决办法欢迎分享!
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^