【问题标题】:Degrading gracefully with Web Workers使用 Web Workers 优雅地降级
【发布时间】:2010-11-13 00:24:26
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 我认为一个很好的附录是如果 Web Worker 不可用,我们可以检查一下是否可以使用 Google Gears 的 Worker Pool

标签: javascript multithreading web-worker


【解决方案1】:

这是 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" ...如何确定?
  • 如果没有网络工作者,你也可以在服务器上做这项工作。这样做的好处是服务器负载会随着用户更新到更好的浏览器而减少。
  • 如果没有支持,if (Worker) 不会抛出引用错误吗?你可能想要if (window.Worker)
  • typeof Worker !== "undefined" 如果您不想引用主机对象。
  • 这在 IE 9 中返回 true(至少在带有最新补丁的 windows 7 上)-caniuse.com/webworkers
【解决方案2】:

琢磨了几天,终于在我的博客上写了一篇文章:
http://codecube.net/2009/07/cross-platform-javascript-webworker/

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

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这是 John Resig 所说的replying to a comment on his blog

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        if(Modernizr.webworkers) 
        {} 
        else
        {}
        

        【讨论】:

          【解决方案7】:

          @geowa4

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-01
            • 2011-08-29
            • 1970-01-01
            • 1970-01-01
            • 2011-11-21
            • 2011-04-14
            • 2023-04-01
            相关资源
            最近更新 更多