使用Web Workers实现优雅降级

18

我开始越来越多地听到关于Web Workers的信息。我认为这非常棒,但迄今为止我还没有看到任何人真正解决的问题是如何支持尚未支持新技术的旧版浏览器。

到目前为止,我能够想出的唯一解决方案是在Web Worker功能周围创建某种包装器,该包装器将回退到某种疯狂的基于定时器的解决方案,以模拟多线程执行。

但即使在这种情况下,如何检测当前执行JavaScript的浏览器是否支持Web Worker功能呢?

谢谢!


我认为一个好的补充是,如果Web Workers不可用,我们能否检查一下是否可以使用Google Gears的Worker Pool。 - Mark W
7个回答

10

这是 Web 开发中一直存在的问题:对于不支持所需功能的浏览器应该怎么处理。目前,我只建议在处理需要长时间执行的复杂任务时使用 Web Workers,并且如果这些任务不能在服务器端完成。这样,如果没有 Web Workers,你只需等待更长时间即可。否则,你将不得不在代码中添加包装器等内容,这样以后可能会让你避免麻烦。 我的降级策略会在页面加载后立即执行。

onload(页面加载完毕)函数伪代码:

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

你仍然需要编写算法两次,但如果你想支持没有Web Workers的浏览器,无论如何你都必须这样做。因此,这引出了一个有趣的问题:是否值得花费时间(和金钱)去写两次,只是为了让一些人能够更快地运行?


"supportsWebWorkers" ... 如何确定它? - Joel Martinez
1
如果没有Web Worker,您也可以在服务器上完成工作。优点是随着用户更新到更好的浏览器,服务器负载会减少。 - Nosredna
6
如果没有支持,if (Worker) 会抛出引用错误,请改成 if (window.Worker)。请注意保持原意不变,使语言更加通俗易懂。 - Jamie Wong
如果您不想引用宿主对象,请返回已翻译的文本,或者返回 typeof Worker !== "undefined" - user254766
这会在IE 9中返回true(至少在安装了最新补丁的Windows 7上)-http://caniuse.com/webworkers - Aaron Sherman

4
在思考了几天之后,我最终在自己的博客上写了一篇文章:http://codecube.net/2009/07/cross-platform-javascript-webworker/。这个想法是,在WebWorker未定义的情况下,有一个包装器API可以使用内置技术。虽然该文章中的示例非常简单,但在所有浏览器中都可以正常工作 :-)。

链接已不可用 :( - Mark E

1

以下是John Resig在回复他博客上的评论中所说:

我考虑过这个问题,但这会很棘手。你必须从一开始就让你的处理代码使用setTimeout/setInterval(这段代码最终将在worker和普通网站上运行)。因此,虽然启用worker的浏览器的结果会稍微慢一些,但至少它可以在两种情况下正常工作。


1
Bespin项目有一个所谓的facade,它允许他们在Web Workers、Gears Workers中运行JavaScript代码,如果这些线程在主线程中不可用。

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;
         }
}

这样你可以在加载时释放一些内存,而且不需要每次都请求支持。


0

我遇到了一个有趣的问题,我的任务在Firefox中没有Web Worker支持时太慢了(无响应脚本),但在所有其他现代浏览器中都足够快。 使用Web Workers,它在除Opera(10.50)之外的所有浏览器中都可以工作,因为Opera根本不支持Web Workers,但是没有Web Workers也可以正常工作。

因此,我编写了一个WorkerFacade,当可用时使用Web Worker API或通过对实际Worker JS进行一些小修改来模拟API。您可以在GitHub上找到WorkerFacade as a gist on GitHub。对我很有效,也可能对其他人有所帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接