似乎从主机到worker的唯一通信是postMessgage
和onmessage
。如果工作程序需要一些动态初始化(如在构造函数中,在这里:稍后要使用的正则表达式),那么执行此操作的最佳方法是什么?
[一种可能是使data
为对象,并具有例如action
参数,并在每次运行时进行检查。这似乎有点笨拙。
不同代理之间的通信通道是非常低级的,但是您可以基于此轻松建立更高级别的通信。我会使用对象来传达不同的“事件”:
{ event: "init", data: [/d/] }
基于这些事件,您可以创建不同的事件来表示例如函数调用及其响应:
{ event: "call-init", data: [/d/] } // >>>
{ event: "return-init", data: ["done"] } // <<<
然后,您可以围绕它构建一个包装,该包装发送并处理响应,类似于:
async function call(name, ...args) {
channel.send("call-" + name, args);
return await cannel.once("return-" + name);
}
channel.init = call.bind(null, "init");
然后您的代码将变成类似以下内容:
const channel = new Channel(worker);
await channel.init(/d/);
await channel.doOtherStuff();
仅是为了提供基本概念。
[除Jonas精心设计的解决方案滥用之外的另一种方法the Worker
's name
option:您可以例如用此名称传递正则表达式字符串,并在以后使用:
test.js
Worker
worker.js
name