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 从未执行过,尽管已加载。
根据您提供的代码,问题在于您没有考虑所编写代码的异步性质。
以下是代码中发生的顺序:
- 您调用
tabs.open()
异步开始打开选项卡的过程。您指定一个函数,以便在 open
事件触发时调用。
"start"
在工作端口上发出。
- 新选项卡的
open
事件触发并附加内容脚本。
- 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");
}
});
});
我的问题是:附加到选项卡的内容脚本没有收到消息 "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 从未执行过,尽管已加载。
根据您提供的代码,问题在于您没有考虑所编写代码的异步性质。
以下是代码中发生的顺序:
- 您调用
tabs.open()
异步开始打开选项卡的过程。您指定一个函数,以便在open
事件触发时调用。 "start"
在工作端口上发出。- 新选项卡的
open
事件触发并附加内容脚本。 - 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");
}
});
});