我开始越来越多地听到关于Web Workers的信息。我认为这非常棒,但迄今为止我还没有看到任何人真正解决的问题是如何支持尚未支持新技术的旧版浏览器。
到目前为止,我能够想出的唯一解决方案是在Web Worker功能周围创建某种包装器,该包装器将回退到某种疯狂的基于定时器的解决方案,以模拟多线程执行。
但即使在这种情况下,如何检测当前执行JavaScript的浏览器是否支持Web Worker功能呢?
谢谢!
我开始越来越多地听到关于Web Workers的信息。我认为这非常棒,但迄今为止我还没有看到任何人真正解决的问题是如何支持尚未支持新技术的旧版浏览器。
到目前为止,我能够想出的唯一解决方案是在Web Worker功能周围创建某种包装器,该包装器将回退到某种疯狂的基于定时器的解决方案,以模拟多线程执行。
但即使在这种情况下,如何检测当前执行JavaScript的浏览器是否支持Web Worker功能呢?
谢谢!
这是 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的浏览器,无论如何你都必须这样做。因此,这引出了一个有趣的问题:是否值得花费时间(和金钱)去写两次,只是为了让一些人能够更快地运行?
if (Worker)
会抛出引用错误,请改成 if (window.Worker)
。请注意保持原意不变,使语言更加通俗易懂。 - Jamie Wongtypeof Worker !== "undefined"
。 - user254766以下是John Resig在回复他博客上的评论中所说:
我考虑过这个问题,但这会很棘手。你必须从一开始就让你的处理代码使用setTimeout/setInterval(这段代码最终将在worker和普通网站上运行)。因此,虽然启用worker的浏览器的结果会稍微慢一些,但至少它可以在两种情况下正常工作。
@geowa4
//globals
var useWorer={}
,noWorkerClosure=function(){...}
,myWorkerClosure=function(){...}
;
function init(){
if(!!window.Worker){
noWorkerClosure=null;
useWorer=new myWorkerClosure();
}
else{
useWorer=new noWorkerClosure();
myWorkerClosure=null;
}
}
这样你可以在加载时释放一些内存,而且不需要每次都请求支持。
我遇到了一个有趣的问题,我的任务在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。对我很有效,也可能对其他人有所帮助。
if(Modernizr.webworkers)
{}
else
{}