2013-02-09 88 views
4

請記住,我以前從未使用過網絡工作者,並且在繞過他們時遇到了一些麻煩。網絡工作者的限制

下面是我在做什麼的簡化版本的解釋。

我的頁面有鏈接到的各種文件 - 有些是文字,有些是圖像等每個文件顯示通用文件圖標的圖像。

我希望腳本與該文件的內容的預覽替換每個通用圖標。

腳本會向服務器請求文件(從而將其添加到緩存中,就像預加載器一樣),然後創建一個畫布並在其上繪製預覽(圖像的縮略圖,文本文件的摘錄,媒體文件的更具體的圖標...),最後用畫布使用數據URL替換通用圖標的源代碼。

我可以很容易地做到這一點。不過,我寧願將它放在後臺,以免在用戶界面運行時干擾用戶界面。

之前我吧;這一點,我需要知道:能工人用帆布工作,如果是的話我將如何創建?我不認爲document.createElement('canvas')會工作,因爲工人不能訪問DOM,或者我誤解了所有我發現的引用說他們「無法訪問DOM」?

回答

6

您無法從網絡工作者訪問DOM。您無法加載圖像。您不能創建畫布元素並從Web工作人員中繪製它們。就目前而言,網絡工作者幾乎侷限於進行ajax調用並執行計算密集型的事情。查看網絡工作者和帆布對象此相關的問題/回答:Web Workers and Canvas與本文有關使用webworkers加快圖像處理:http://blogs.msdn.com/b/eternalcoding/archive/2012/09/20/using-web-workers-to-improve-performance-of-image-manipulation.aspx

你的最簡單的辦法是大塊的工作成小塊(不含網絡工作者),並做了大塊一次,做一個setTimeout(),然後處理下一塊工作。這將允許用戶界面在您完成工作的同時進行響應。如果有任何CPU消耗的計算要完成(如進行圖像分析),則可以將這個計算結果傳遞給Web工作人員,並且可以通過消息將結果發送回主線程以放入DOM中,但如果沒有,那麼只需在更小的塊中完成工作就可以保持UI的活躍。

零件像加載圖像的任務,取出由服務器等數據......,還可以異步,所以如果處理得當,它不會與UI的響應能力反正做。

下面是分塊的總體思路:

function doMyWork() { 
    // state variables 
    // initialize state 
    var x, y, z; 

    function doChunk() { 
     // do a chunk of work 
     // updating state variables to represent how much you've done or what remains 

     if (more work to do) { 
      // schedule the next chunk 
      setTimeout(doChunk, 1); 
     } 

    } 
    // start the whole process 
    doChunk(); 
} 
+0

你的意思是你無法加載圖像?就像下載它們或將它們顯示爲「img」一樣? – ozanmuyes 2014-01-13 00:01:22

+0

@dihejaso - 網絡工作者限制他們可以做什麼,不可以做什麼。他們不能創建DOM元素。 – jfriend00 2014-01-13 00:05:55

+0

好了,現在清楚了;我們可以通過XHR下載任何東西,但DOM受到限制。由於'postMessage()'函數存在,DOM更新可以通過封裝源文件來實現。 – ozanmuyes 2014-01-13 05:47:01

0

網絡工作者的另一個(令人沮喪的)限制是它不能在Chrome中使用地理定位。 只是我的兩分錢。