处理来自无法访问代码创建的 Webworker 的消息
Process message from Webworker created by unreachable code
我真的是 JavaScript 的新手,如果答案很明显,我很抱歉。
我想从网络工作者向主线程发送消息。我无权访问创建工作人员的代码部分,因此我不能只添加 worker.onmessage = [...]
。我可以访问在我的流程开始时执行的 JavaScript 代码,但不能访问创建工作人员的代码。
我想知道是否有办法做类似 window.onEveryMessageFromAnyWorker = doSomeMagic()
的事情
非常感谢!
不,那不可能。您需要 Web Worker 的句柄才能收听其消息。如果您无法阅读以下内容,请确保您确实无法更改构成 worker 的代码:
Hacky 解决方案
如果您正在编写用户脚本或其他“hacky”代码,我建议您重写 worker 构造函数:
// Execute this before the worker is being created
window.OldWorker = Worker;
window.Worker = function(path) {
console.log("Worker created: ", path);
// The original worker is applied on this object
return new OldWorker(path);
}
请注意,这是一段令人讨厌的代码。它可能会破坏东西。
获得此代码后,您可以访问创建的工作程序:
window.Worker = function(path) {
console.log("Worker created: ", path);
var worker = new OldWorker(path);
if(path == "something.js") {
// do something
worker.addEventListener("message", (e)=>{console.log("Message:", e.data});
}
// The original worker is applied on this object
return worker;
}
请注意,您必须使用worker.addEventListener
。设置 .onmessage
会导致您的回调被覆盖,因为 onmessage
属性.
中只能有一个回调
我真的是 JavaScript 的新手,如果答案很明显,我很抱歉。
我想从网络工作者向主线程发送消息。我无权访问创建工作人员的代码部分,因此我不能只添加 worker.onmessage = [...]
。我可以访问在我的流程开始时执行的 JavaScript 代码,但不能访问创建工作人员的代码。
我想知道是否有办法做类似 window.onEveryMessageFromAnyWorker = doSomeMagic()
非常感谢!
不,那不可能。您需要 Web Worker 的句柄才能收听其消息。如果您无法阅读以下内容,请确保您确实无法更改构成 worker 的代码:
Hacky 解决方案
如果您正在编写用户脚本或其他“hacky”代码,我建议您重写 worker 构造函数:
// Execute this before the worker is being created
window.OldWorker = Worker;
window.Worker = function(path) {
console.log("Worker created: ", path);
// The original worker is applied on this object
return new OldWorker(path);
}
请注意,这是一段令人讨厌的代码。它可能会破坏东西。
获得此代码后,您可以访问创建的工作程序:
window.Worker = function(path) {
console.log("Worker created: ", path);
var worker = new OldWorker(path);
if(path == "something.js") {
// do something
worker.addEventListener("message", (e)=>{console.log("Message:", e.data});
}
// The original worker is applied on this object
return worker;
}
请注意,您必须使用worker.addEventListener
。设置 .onmessage
会导致您的回调被覆盖,因为 onmessage
属性.