有没有办法在webworker中加载一个类,而不仅仅是普通的javascript文件?
我想在webworker中加载一个文件,但它不是一个普通的javascript文件。这是一门课。因此,我们不需要将javascript文件url写入 新工人(filename.js) 我正在通过写作初始化课堂 新工作者(新类名()) 它正在读取文件并正确加载。它甚至在构造函数中显示console.log消息。但当控件移动到主文件中的postMessage方法时,它会抛出错误 我正在处理的应用程序具有非常复杂的结构。我们有一个公共模块,其中包含几个类,这些类在整个应用程序中执行一些公共功能。如果我直接在应用程序中执行,我正在使用的功能可能会导致性能问题。因此,我将它加载到webworker中。因为它是一个类,所以我必须使用new关键字调用它。因此,不是:有没有办法在webworker中加载一个类,而不仅仅是普通的javascript文件?,javascript,class,web-worker,Javascript,Class,Web Worker,我想在webworker中加载一个文件,但它不是一个普通的javascript文件。这是一门课。因此,我们不需要将javascript文件url写入 新工人(filename.js) 我正在通过写作初始化课堂 新工作者(新类名()) 它正在读取文件并正确加载。它甚至在构造函数中显示console.log消息。但当控件移动到主文件中的postMessage方法时,它会抛出错误 我正在处理的应用程序具有非常复杂的结构。我们有一个公共模块,其中包含几个类,这些类在整个应用程序中执行一些公共功能。如果我
var ww = new Worker(filename.js);
我在写:
var ww = new Worker(new ClassName());
现在,它调用该类,将在控制台中记录在构造函数中编写的语句,但在主文件中执行postMessage时,javascript抛出错误并停止该方法的执行
请参阅下面的代码:
mainFile.js
var ww = new Worker(new CommonWebWorker());
ww.postMessage('LOAD');
ww.onmessage = function (e) {
console.log(e.data);
}
CommonWebWorker.js
'use strict';
class CommonWebWorker {
constructor() {
console.log("commonWebWorker invoked");
this.onmessage = function (e) {
this.postMessage((e.data === 'LOAD' ? 'Loading...' : 'Loading Error'));
}
}
}
module.exports = CommonWebWorker;
我希望该文件将通过WebWorker在后台加载,但实际上它正在中断并抛出下面提到的错误
获取404(未找到)
非常感谢您提供的任何帮助。出现错误的原因是
Worker
希望URL字符串作为其第一个参数,而不是对象。因此,它将其转换为字符串,当您在大多数对象上执行此操作时,您会得到“[object object]”“
(虽然我本来希望代码中出现“[object CommonWebWorker]”“
,但我假设您使用的是transpiler或其他输出ES5代码的东西,这将为您提供“[object object]”
)
您的主页和工作是完全不同的JavaScript环境。如果需要,您当然可以在worker中使用类,但您需要在worker中实例化它,例如:
class CommonWebWorker {
// ...
}
new CommonWebWorker(); // To instantiate it
您的worker还可以通过从另一个JavaScript文件导入类
(不久它就可以使用ES2015+模块语法),因此如果您想在多个worker中使用同一个类,您可以将其放在自己的文件中并执行以下操作:
importScripts("common-web-worker.js");
new CommonWebWorker(); // To instantiate it
一旦ES2015+语法在workersª中广泛使用,您就可以使用相关的模块标志(newworker(“worker.js”{type:“module”})
)启动worker,并改为执行以下操作:
import CommonWebWorker from "./common-web-worker.js";
new CommonWebWorker();
大约一个月前我检查了一下,唯一支持它的浏览器是Chrome,它背后有一个
--启用实验性web平台功能的标志。但这东西变化很快…:-) Worker()
构造函数的参数必须是URL字符串。它可以是Blob URL字符串。它不能只是某个类的实例。通常它接受脚本位置的url。我想您不能使用direct类。您可以尝试这个新工作程序(URL.createObjectURL(new ClassName())代码>我没有测试它…:-|