19

所以我开始听到越来越多的关于Web Workers的消息。我认为这绝对很棒,但到目前为止我还没有看到任何人真正解决的问题是如何支持尚不支持新技术的旧浏览器。

到目前为止,我能够提出的唯一解决方案是围绕 Web Worker 功能制作某种包装器,该包装器将退回到一些基于计时器的疯狂解决方案,该解决方案将模拟多线程执行。

但即使在这种情况下,如何检测网络工作者是否是当前执行 javascript 的浏览器的支持功能?

谢谢!

4

7 回答 7

11

这是 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 的浏览器,无论如何你都必须这样做。所以这就引出了一个有趣的问题:是否值得花时间(和金钱)写两遍,这样对某些人来说可以快一点?

于 2009-07-22T14:13:52.233 回答
4

在咀嚼了几天之后,我最终在我的博客上写了一篇文章:http:
//codecube.net/2009/07/cross-platform-javascript-webworker/

这个想法是,在未定义 WebWorker 的情况下,有一个仅使用内置技术的包装 API。虽然文章中的示例非常简单,但它确实适用于所有浏览器 :-)

于 2009-07-29T19:10:09.860 回答
2

Bespin 项目(他们称之为)有一个外观,允许他们在 Web Worker、Gears Worker 中运行 JavaScript 代码,如果这些代码在主线程中不可用。

于 2009-07-23T13:13:00.470 回答
1

这是 John Resig在他的博客上回复评论时所说的

我想过这个——但这会很棘手。您必须让您的处理代码从一开始就使用 setTimeout/setInterval(此代码最终会在工作人员和普通网站上工作)。因此,虽然结果对于支持 worker 的浏览器来说会稍微慢一些,但至少它在这两种情况下都可以工作。

于 2009-07-22T15:13:27.097 回答
0

我遇到了一个有趣的问题,即在没有 Web Worker 支持的情况下,我的任务在 Firefox(无响应的脚本)中太慢了,但在所有其他现代浏览器中却足够快。有了 Web Worker,它可以在所有浏览器中运行,除了 Opera (10.50),它根本不支持 Web Worker,但是没有它们 Opera 也能正常工作。

所以我写了一个 WorkerFacade,它在可用时使用 Web Worker API,或者在实际的 Worker JS 中添加一些小的添加来伪造 API。您可以在 GitHub 上找到 WorkerFacade 作为要点。对我来说效果很好,也可能对其他人有帮助。

于 2010-07-03T22:25:27.517 回答
0

您可以使用 Modernizr ( http://modernizr.com/download/#-webworkers ) 来检测浏览器是否支持 webworkers,此时您必须拥有两个版本...您可以在http 上查看带有 webworkers 的浏览器: //caniuse.com/webworkers

if(Modernizr.webworkers) 
{} 
else
{}
于 2013-10-01T21:58:15.743 回答
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;
         }
}

通过这种方式,您可以释放一些内存,并且无需每次都寻求支持。

于 2014-12-18T15:55:17.160 回答