2009-07-22 146 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; 
     } 
} 

這樣你就可以免費下載一些內存,而且你不需要每次都要求支持。