Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何加载web worker文件?_Javascript_Web Worker - Fatal编程技术网

Javascript 如何加载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); } 因此,事件流如下所

我想在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);
}
因此,事件流如下所示:

窗口--
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文件怎么样