worker.port.emit() 不起作用,或者至少消息未送达

worker.port.emit() doesn't work, or, at least, the message isn't delivered

我的问题是:附加到选项卡的内容脚本没有收到消息 "start",因此没有执行。

代码似乎是正确的,我查找了一些相关的 Whosebug 问题,但没有找到解决方案。 代码是这样的:
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

消息 "worker emitted start" 出现所以我假设 emit() 已经执行,但是 cs3.js 没有消息并且使用调试器我注意到 cs3.js 从未执行过,尽管已加载。

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

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

  1. 您调用 tabs.open() 异步开始打开选项卡的过程。您指定一个函数,以便在 open 事件触发时调用。
  2. "start" 在工作端口上发出。
  3. 新选项卡的 open 事件触发并附加内容脚本。
  4. cs3.js 中的工作人员正在等待查看从主进程发出的 "start"

如您所见,"start" 在选项卡打开之前发出,因此在 cs3.js 中的 worker 被附加到选项卡。

以下内容应该有效:

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");
        }
    });
});