Javascript 如何加载web worker文件?
我想在web worker加载后立即向其发送一些内容。代码如下所示:Javascript 如何加载web worker文件?,javascript,web-worker,Javascript,Web Worker,我想在web worker加载后立即向其发送一些内容。代码如下所示: 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); } 因此,事件流如下所
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
->webworker--Hello-World
->window->console.log(ev.data)
我的问题是为什么这样做?这意味着同步加载了worker.js
文件。对吗
我甚至尝试在web worker中加载其他文件:
importScripts('foo.js');
importScripts('bar.js');
即使加载这些文件也可以正常工作。为什么?如何从低级角度加载web worker文件?新worker(“worker.js”)
不会“网络阻止”调用线程(“主线程”)。new
调用的返回与工作进程的状态无关。worker可能还没有完成执行脚本、加载脚本,甚至还没有将自己初始化到可以开始/命令加载脚本的状态
以下onmessage
是在主线程中设置的,与工作线程状态无关。这也不妨碍
postMessage()
调用将在不等待接收消息的情况下为工作线程排队。此时,主线程执行完毕(“跌入底部”),其事件循环将等待事件
辅助线程独立于主线程运行(这就是创建辅助线程的全部意义)。它将首先运行其worker脚本。现在我想不出任何方法让它(暂时)产生执行,这意味着整个辅助脚本需要“跌破底部”,即在辅助脚本的单个事件循环(再次)得到控制之前完成执行
只有在主线程运行工作线程的事件循环时,Javascript才会拾取来自主线程的消息。将调用工作线程的onmessage()
函数,该函数将消息排入主线程队列。甚至在工作线程的postMessage()
完成之前,主线程可能已经拾取了该消息。(当然,如果工人空闲,也可能发生相反的情况。)
辅助线程中的中间importScripts()
是同步的,并阻止辅助线程,而不是主线程
同步阻塞importScripts()
的替代方法是使用new Worker('Worker.js',{type:'module'})
的模块Worker。它们将importScripts()
替换为异步import()
或同步import
。到目前为止,很少有浏览器支持这一点。Blink是的,但对于Opera来说,我不知道没有它怎么能支持它
(有关更多信息,请尝试此操作。)新工作线程(“Worker.js”)
不会“网络阻塞”调用线程(“主线程”)。new
调用的返回与工作进程的状态无关。worker可能还没有完成执行脚本、加载脚本,甚至还没有将自己初始化到可以开始/命令加载脚本的状态
以下onmessage
是在主线程中设置的,与工作线程状态无关。这也不妨碍
postMessage()
调用将在不等待接收消息的情况下为工作线程排队。此时,主线程执行完毕(“跌入底部”),其事件循环将等待事件
辅助线程独立于主线程运行(这就是创建辅助线程的全部意义)。它将首先运行其worker脚本。现在我想不出任何方法让它(暂时)产生执行,这意味着整个辅助脚本需要“跌破底部”,即在辅助脚本的单个事件循环(再次)得到控制之前完成执行
只有在主线程运行工作线程的事件循环时,Javascript才会拾取来自主线程的消息。将调用工作线程的onmessage()
函数,该函数将消息排入主线程队列。甚至在工作线程的postMessage()
完成之前,主线程可能已经拾取了该消息。(当然,如果工人空闲,也可能发生相反的情况。)
辅助线程中的中间importScripts()
是同步的,并阻止辅助线程,而不是主线程
同步阻塞importScripts()
的替代方法是使用new Worker('Worker.js',{type:'module'})
的模块Worker。它们将importScripts()
替换为异步import()
或同步import
。到目前为止,很少有浏览器支持这一点。Blink是的,但对于Opera来说,我不知道没有它怎么能支持它
(有关更多信息,请尝试此操作。)消息传递是异步的。每个JS环境都有自己的事件队列。“我的问题是为什么这样做?”不确定是否正确解释了这个问题?“如何加载web worker文件”
worker
也可以从同一页面上的js
加载,而无需参考“外部”文件。请看@Bergi,我知道,但我问的是如何加载工作文件。那是同步的还是异步的(newworker(“Worker.js”)
)?它似乎是同步的。@IonicăBizău:sync,是的,但在新的webworker线程中。它确实会立即返回一个Worker
对象。构造函数不会等待加载文件。@Bergi OK,在加载文件之前是否可以从主窗口发出一些信息?如果没有,是否存在load
事件,或者我可以监听并确保工作人员正在监听事件?我在使用iframes的PostMessageAPI中遇到了类似的问题。消息传递是异步的。每个JS环境都有自己的事件队列。“我的问题是为什么这样做?”不确定是否正确解释了这个问题?“web worker文件怎么样