2009-07-22 144 views
19

所以我开始越来越多地听到关于Web Workers的消息。我认为这绝对是太棒了,但我迄今还没有看到任何人真正解决的问题是如何支持尚未支持新技术的旧浏览器。随着网络工作者的优雅降级

迄今为止唯一能够提出的解决方案是围绕Web工作者功能制作一些包装,这些包装将回退到一些基于计时器的疯狂解决方案,以模拟多线程执行。

但即使在这种情况下,如何检测web worker是否是当前正在执行javascript的浏览器的受支持功能?

谢谢!

+0

我认为一个好的编是,如果Web Workers是不可用的,我们可以检查,看看我们是否可以使用谷歌Gears的工作池 – 2009-07-29 19:14:22

回答

11

这是Web开发的一个古老的问题:如何处理不支持您需要的浏览器。目前,我只提倡使用Web Workers来完成复杂的,长时间运行的任务,因为某些原因,这些任务不能在服务器端完成。这样,如果你没有网络工作者,你只需等待更长时间。否则,你将不得不用你的代码弄乱你的代码,以及你以后会尽量避免的东西。一旦页面加载,我的降解策略就会发生。

的onload功能的伪代码:

if(window.Worker /*check for support*/) 
    someObject.myFunction = function() { /*algorithm that uses Web Workers*/ } 
else 
    someObject.myFunction = function() { /* sad face */ } 

你仍然需要编写算法的两倍,但你必须这样做,无论如何,如果你想支持的浏览器没有网络的工人。这就提出了一个有趣的问题:值得花费两次时间(和金钱)来写一些东西,这对一些人来说可能会更快一些?

+0

‘supportsWebWorkers’......如何将一个确定的? – 2009-07-22 15:52:10

+0

@Joel:'如果(工人)...` – geowa4 2009-07-22 17:20:41

+0

@Joel:编辑为清楚起见 – geowa4 2009-07-22 17:21:27

1

这里是约翰Resig的说:replying to a comment on his blog

我想到了这一点 - 但它会非常棘手。你必须使你的处理代码从一开始就使用setTimeout/setInterval(这个代码最终可以在一个工作者和一个普通的网站上工作)。所以,虽然支持工作的浏览器的结果稍微慢一些,但至少在两种情况下都可以。

2

的贝斯平的项目有(他们所说的)一个facade,使他们能够在网络工作者,齿轮工人运行JavaScript代码,如果这些不可用在主线程。

0

我有一个有趣的问题,即没有Web Worker支持的任务在Firefox(无响应脚本)中速度太慢,但是速度足够快其他现代浏览器。 随着Web Workers在除了Opera(10.50)之外的所有浏览器中都能正常工作,Opera根本不支持Web Workers,但Opera在没有它们的情况下运行良好。

因此,我编写了一个WorkerFacade,在可用时使用Web Worker API,或者通过对实际Worker JS进行一些小的添加来欺骗API。你可以找到WorkerFacade as a gist on GitHub。为我工作得很好,也可以帮助别人。

0

@ geowa4

//globals 
var useWorer={} 
    ,noWorkerClosure=function(){...} 
    ,myWorkerClosure=function(){...} 
    ; 
function init(){ 
     if(!!window.Worker){ 
      noWorkerClosure=null; 
      useWorer=new myWorkerClosure(); 
     } 
     else{ 
      useWorer=new noWorkerClosure(); 
      myWorkerClosure=null; 
     } 
} 

这样你就可以免费下载一些内存,而且你不需要每次都要求支持。