2012-08-15 89 views
1

我設法使用附加SDK在我的Firefox附加組件中獲得Web Worker(不是內容/工作者)。我遵循弗拉基米爾的建議在這裏得到Worker類的工作:Concurrency with Firefox add-on script and content scriptFileReaderSync在Firefox擴展中使用附加SDK在Web Worker內部未定義

現在,我可以在我的代碼中啓動一個工作者,並且可以通過發送/接收消息與它交談。

這是我main.js文件:

// spawn our log reader worker 
var worker = new Worker(data.url('log-reader.js')); 

// send and respond to some dummy messages 
worker.postMessage('halo'); 
worker.onmessage = function(event) { 
    console.log('received msg from worker: ' + event.data); 
}; 

這是我的日誌文件reader.js:

// this function gets called when main.js sends a msg to this worker 
// using the postMessage call 

onmessage = function(event) { 
    var info = event.data; 

    // reply back 
    postMessage('hey addon, i got your message: ' + info); 
    if (!!FileReaderSync) { 
     postMessage('ERROR: FileReaderSync is not supported'); 
    } else { 
     postMessage('FileReaderSync is supported'); 
    } 

// var reader = new FileReaderSync(); 
// postMessage('File contents: ' + reader.readAsText('/tmp/hello.txt')); 
}; 

我的問題是,FileReaderSync類不是對數內定義reader.js文件,結果我得到錯誤信息。如果我取消註釋FileReaderSync實際使用的最後一行,我將永遠不會在我的插件中找回消息。

我用我用工人同樣的伎倆試圖通過創建一個dummy.jsm文件和導入在main.js,但FileReaderSync將只可在main.js,而不是在數reader.js:

// In dummy.jsm 
var EXPORTED_SYMBOLS=["Worker"]; 
var EXPORTED_SYMBOLS=["FileReaderSync"]; 

// In main.js 
var { Worker, FileReaderSync } = Cu.import(data.url('workers.jsm')); 
Cu.unload(data.url("workers.jsm")); 

我想,必須有一個解決方案,因爲該文件here似乎表明FileReaderSync類應可在Firefox網絡工作者:

此接口僅適用於勞動者,因爲它使可能會阻塞的同步I/O。

那麼,有沒有辦法讓FileReaderSync在Web Worker代碼中可用和可用?

+0

要調試工人是有幫助的定義'worker.onerror =函數(事件){的console.log(event.data); ''否則你不會看到工人發生的錯誤。 – 2012-08-16 07:10:31

回答

0

事實上,如果您的工作人員發送了「錯誤」,如果FileReaderSync,因爲您已將其取消兩次。將!!FileReaderSync更改爲!FileReaderSync,它將正常工作。

我想你試圖找到你註釋掉的代碼的問題。問題是,reader.readAsText('/tmp/hello.txt')將不起作用 - 此方法需要blob(或file)。工人本身不能建立一個文件,但您可以在擴展創建和發送給工人一個消息:

worker.postMessage(new File("/tmp/hello.txt")); 

:我不知道該加載項SDK是否定義了File構造,您可能必須使用與構造函數Worker相同的技巧。

工人然後可從該文件中讀出的數據:

onmessage = function(event) 
{ 
    var reader = new FileReaderSync(); 
    postMessage("File contents: " + reader.readAsText(event.data)); 
} 
+0

再次感謝弗拉基米爾!菜鳥的錯誤:P現在一切正常,我也必須導出File類。 – 2012-08-16 14:48:03