我设法使用插件 SDK 在我的 Firefox 插件中获得了 Web Worker(不是内容/工作者)。我在这里按照弗拉基米尔的建议让 Worker 类正常工作:Concurrency with Firefox add-on script and content script
现在,我可以在我的代码中启动一个工作者,并可以通过发送/接收消息与它交谈。
这是我的 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);
};
这是我的 log-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'));
};
我的问题是 log-reader.js 文件中没有定义 FileReaderSync 类,因此我收到了错误消息。如果我取消注释实际使用 FileReaderSync 的最后几行,我将永远不会在我的插件中收到消息。
我尝试使用与 Worker 相同的技巧,通过创建一个 dummy.jsm 文件并在 main.js 中导入,但 FileReaderSync 仅在 main.js 中可用,而在 log-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"));
我认为必须有一个解决方案,因为这里的文档似乎表明 FileReaderSync 类应该对 Firefox 中的 Web Worker 可用:
此接口仅在工作人员中可用,因为它启用了可能会阻塞的同步 I/O。
那么,有没有办法让 FileReaderSync 在我的 Web Worker 代码中可用和可用?