【发布时间】:2020-10-14 08:29:33
【问题描述】:
我想在加载后立即向网络工作者发出一些东西。代码如下:
var w = new Worker("worker.js");
w.onmessage = function (ev) {
console.log(ev.data);
};
w.postMessage("Hello World");
在worker.js 我有:
this.onmessage = function (ev) {
self.postMessage(ev.data);
}
所以,事件流程是这样的:
窗口 --
Hello World-> web worker --Hello World-> 窗口 ->console.log(ev.data)
我的问题是为什么会这样?这意味着worker.js 文件是同步加载的。对吗?
我什至尝试在 web worker 中加载其他文件:
importScripts('foo.js');
importScripts('bar.js');
即使加载这些文件也能正常工作。为什么?从底层的角度来看,Web Worker 文件是如何加载的?
【问题讨论】:
-
消息传递是异步的。每个 JS 环境都有自己的事件队列。
-
“我的问题是为什么这行得通?” 不能正确解释问题? “如何加载 web worker 文件”
Worker也可以从同一页面上的js加载,而无需引用“外部”“文件”。见developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/… -
@Bergi 我知道,但我在问关于加载工作文件的问题。是同步还是异步(
new Worker("worker.js"))?好像是同步的。 -
@IonicăBizău:同步,是的,但在新的 webworker 线程中。它会立即返回一个
Worker对象。构造函数不会等待文件被加载。 -
@Bergi 好的,是否可以在文件本身加载之前从主窗口发出一些东西?如果没有,是否有
load事件或者我可以收听并确保工作人员正在收听事件?我在使用 iframe 的 postmessage api 中遇到了类似的问题。
标签: javascript web-worker