在webworkers上制作自定义事件

时间:2016-10-13 13:29:08

标签: javascript web-worker

我做了一个webworker并尝试添加一个名为progress的自定义事件,如下所示:

self.updateProgress = function(no){
    let event = new CustomEvent(
        'progress',
        {
            detail : {
                description: "event from webworker to update progress",
                timeofevent: new Date(),
                eventcode: 15
            },
            bubbles: true,
            cancelable: false,
            data : no
        });
        self.console.log(self.dispatchEvent(event));
    };

在父JavaScript上:

scope.worker.addEventListener('progress', (e) => { //cannot add custom events to worker yet
    scope.progress = e.data;
});

问题是事件永远不会被触发,而且根据我的阅读,似乎消息和错误是附加到worker对象的唯一事件。是否无法添加自定义事件?

1 个答案:

答案 0 :(得分:2)

您在主线程中设置了worker.addEventListener('message', (e) => {}),但在工作时没有self.dispatchEvent。相反,您调用self.postMessage(obj, []);并且worker实现完成工作(在线程和触发事件之间传递数据)。

Chrome中的WebWorker原型为EventTarget,因此您可以将其用作创建它的事件目标。但是主线程中的worker和worker中的self不是同一个对象/范围,因此您可以在不同的目标上调度事件和侦听事件。

但没有什么能阻止您使用标准self.postMessage方式来跟踪加载进度。