使用附加SDK在Firefox扩展中的Web Worker中未定义FileReaderSync

时间:2012-08-15 18:15:15

标签: javascript firefox-addon firefox-addon-sdk

我设法使用Add-on SDK在我的Firefox插件中获得Web Worker(不是内容/工作者)。我遵循弗拉迪米尔的建议,让工人阶级工作:Concurrency with Firefox add-on script and content script

现在,我可以在我的代码中启动一个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);
};

这是我的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"));

我认为必须有一个解决方案,因为文档here似乎表明FileReaderSync类应该可供Firefox中的Web Worker使用:

  

此接口仅在worker中可用,因为它启用可能阻止的同步I / O.

那么,有没有办法让FileReaderSync在我的Web Worker代码中可用和可用?

1 个答案:

答案 0 :(得分:1)

实际上,如果您将<{1}} 定义为,那么您的工作人员会发送“错误”,因为您已将其否定了两次。将FileReaderSync更改为!!FileReaderSync,它将正常运行。

我猜你试图找出你注释掉的代码的问题。问题是,!FileReaderSync不起作用 - 此方法需要blob(或file)。工作程序本身无法构造文件,但您可以在扩展中创建它,并使用以下消息发送给工作人员:

reader.readAsText('/tmp/hello.txt')

注意:我不确定Add-on SDK是否定义了worker.postMessage(new File("/tmp/hello.txt")); 构造函数,您可能必须使用与File构造函数相同的技巧。

然后,工作人员可以从该文件中读取数据:

Worker