【问题标题】:FileReaderSync undefined inside Web Worker in Firefox extension using Add-on SDKFileReaderSync undefined inside Web Worker in Firefox extension using Add-on SDK
【发布时间】:2012-08-15 18:15:14
【问题描述】:

我设法使用插件 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"));

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

此接口仅在工作线程中可用,因为它启用了可能会阻塞的同步 I/O。

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

【问题讨论】:

  • 要调试工作器,定义worker.onerror = function(event) { console.log(event.data); } 很有帮助 - 否则您将看不到工作器中发生的错误。

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


【解决方案1】:

实际上,如果 FileReaderSync 被定义了,你的工作人员会发送“ERROR”,因为你已经否定了它两次。把!!FileReaderSync改成!FileReaderSync就可以正常工作了。

我猜你试图找出你注释掉的代码的问题。问题是,reader.readAsText('/tmp/hello.txt') 不起作用 - 此方法需要一个 blob(或 file)。 worker 本身无法构建文件,但您可以在扩展程序中创建它并通过消息发送给 worker:

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

注意:我不确定附加 SDK 是否定义了 File 构造函数,您可能必须使用与 Worker 构造函数相同的技巧。

worker 可以从这个文件中读取数据:

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

【讨论】:

  • 再次感谢弗拉基米尔!菜鸟错误:P 现在一切正常,我也必须导出 File 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多