我在我的 React 应用程序中使用 Web Worker,它有一个如下所示的辅助类:
export class WebWorker {
constructor(worker) {
const code = worker.toString();
const blob = new Blob(["(" + code + ")()"]);
return new Worker(URL.createObjectURL(blob));
}}
工人看起来像:
export default () => {
self.addEventListener('message', function (e) {
switch (e.data.event) {
case 'start':
// Start back ground task
break;
case 'stop':
// Stop background task
break;
}
}, false);
然后我可以使用创建工人
let sessionWorker = new WebWorker(SessionWorker);
sessionWorker.postMessage({event: "start"})
这工作正常,但是我现在需要使用 SharedWorker 并且我无法让它工作。我发现的所有资源都显示了普通的网络工作者。有这个 SO Question Using Shared Worker in React但它对我不起作用。它实际上看起来与我的常规 WebWorker 代码相同,但这不起作用,因为 SharedWorkers 要求您实现一个 onconnect 函数,而我不明白该怎么做。我发现的非反应示例将工作脚本显示为:
onconnect = function(e) {
var port = e.ports[0];
port.onmessage = function(e) {
var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
port.postMessage(workerResult);
}
}
但是如果我把它放在我的 worker js 文件中并使用 WebWorker 帮助程序遵循相同的模式,worker.toString() 只会返回 [object Window] 并且它永远不会被执行。我不明白如何创建一个将被调用的“onconnect”函数。我尝试过这样的变体:
import React from 'react';
self.onconnect = (e) => {
var port = e.ports[0];
console.log("test log");
port.onmessage = function(e) {
console.log("Message received ", e)
port.postMessage("test");
}
}
export default self;
最终没有什么对我有用。显然我根本不懂 Javascript 中的导出。如果我只是导出一个名为 onconnect 的函数,它永远不会被调用,显然 onconnect 必须属于某种类上下文(如 Window 或 Self),但我不明白需要什么
谢谢你,特洛伊。