worker.port.emit()不起作用,或者至少没有传递消息

时间:2015-03-25 18:45:22

标签: firefox firefox-addon

我的问题是:附加到标签的内容脚本没有收到消息"开始",然后不执行。

代码似乎是正确的,我找了一些相关的StackOverflow问题,但我没有找到解决方案。 代码是这样的:
main.js:

panel.port.on("process", function() {
    tabs.open({
        url: "./tab.html",
        onOpen: function(tab) {
            worker = tab.attach({
                contentScriptFile: [ "./cs1.js", "./cs2.js", "./cs3.js" ],
                contentScriptOptions: { data : data }
            })
        }
    });
    worker.port.emit("start", "start");
    console.log("worker emitted start");
});

cs3.js:

self.port.on("start", function(start) {
// do stuff

消息"工作人员发出开始"因此我假设emit()已被执行,但没有来自 cs3.js 的消息并且使用调试器我注意到 cs3.js 永远不会执行,尽管被加载。

1 个答案:

答案 0 :(得分:0)

根据您提供的代码,问题在于您没有考虑您编写的代码的异步性质。

以下是代码中发生的事情的顺序:

  1. 您调用tabs.open()异步开始打开选项卡的过程。您可以指定在open事件触发时调用的函数。
  2. "start"在工作端口上发出。
  3. 新标签的open事件触发,内容脚本已附加。
  4. cs3.js 中的工作人员正在等待查看主进程发出的"start"
  5. 正如您所看到的那样,在标签打开之前发出了"start",因此,在 cs3.js 中的工作人员被附加到标签之前。

    以下内容应该有效:

    main.js

    var worker;
    panel.port.on("process", function() {
        tabs.open({
            url: "./tab.html",
            onOpen: function(tab) {
                worker = tab.attach({
                    contentScriptFile: [ "./cs1.js", "./cs2.js", "./cs3.js" ],
                    contentScriptOptions: { data : data }
                })
                worker.port.emit("start", "start");
                console.log("emitted start to worker");
            }
        });
    });