处理来自Webworker的消息,由无法访问的代码创建

时间:2016-04-19 19:46:55

标签: javascript web-worker postmessage emscripten

我对JavaScript很新,如果答案显而易见,我很抱歉。

我想从网络工作者向主线程发送消息。我无法访问创建工作人员的代码部分,因此我无法添加goog.provide/goog.require。我可以访问在我的流程开始时执行的JavaScript代码,但不能访问创建工作者的代码。

我想知道是否有办法做worker.onmessage = [...]

之类的事情

非常感谢!

1 个答案:

答案 0 :(得分:1)

不,那是不可能的。您需要Web 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属性中只能有一个回调。