2012-08-15 86 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