在Web Worker中的RequireJS - 没有调用onmessage

时间:2014-06-25 12:55:58

标签: javascript requirejs web-worker

我在网络工作者中使用RequireJS时遇到问题,尤其是处理第一版 worker.js 中未调用的onmessage处理程序。

app.js

var w = new Worker('worker.js');
w.postMessage(someData);

w.onmessage = function(event) {
    console.log(event.data);
};

worker.js [与RequireJS - 正常,但没有错误]

importScripts('require.js');

require({ baseUrl: 'foo' },
    ['dependency1'],
    function(dependency1) {

        self.onmessage = function (event) { // never called
            // do something with event.data...
            self.postMessage(data);
        };

        self.postMessage('debug'); // this one works
    }
);

worker.js [没有RequireJS - 工作]

onmessage = function (event) {
    // do something with event.data...
    postMessage(data);
};

1 个答案:

答案 0 :(得分:3)

这是网络工作者:

require({baseUrl: "../lib"},
["require","timer"], function(Timer) {
     self.onmessage = function(event) { console.log("Received"); }
     postMessage("In require");
});

这是调用它的模块:

var worker = new Worker('src/workers/worker.js'); 
worker.postMessage("hello"); //This fails
worker.onmessage = function(event) {
console.log(event);
};

然而,从postMessage到工作者的按钮的调用成功。我得到received了。

怀疑异步加载问题,我修改了我的代码。

var worker = new Worker('src/workers/timer_worker.js');
   console.log(worker);
   worker.onmessage = function(event) {
       console.log(event);
       switch(event.data.message) {
           case "loaded": 
                worker.postMessage("hello");
           break;
       };
   };

让工作人员在需要模型中完成加载后发送一条消息,并在响应中触发后续代码。

编辑 - 这是一个让它更清晰的图表。 onmessage来电是粉红色的:

UML sequence diagram showing web worker synchronization