Worker 对象
Worker对象能够实现JS的多线程编程,但JS中的多线程与大多数语言的多线程的结构不同,JS的多线程实际上更像网络编程的 C/S(客户端/服务器) 架构
Worker在构造时需要接收一个JS文件
var worker = new Worker('JsFilePath.js');
虽然传递了一个JS文件,但是它不会立刻被执行,就想在其他语言里创建好了线程对象,还需要一个方法去启动这个线程对象
Worker对象想要启动线程必须需要发送一条信息,Worker对象提供了postMessage()方法进行信息的传递
worker.postMessage('启动线程');
// 其中可以传递任何对象(不包含BOM,DOM等)
onmessage 事件
居然发送了信息,那么肯定就需要有接收信息的地方,Worker对象提供了onmessage事件使得Worker对象在调用postMessage()方法时能够接收信息并作出相应的处理
构建Worker对象后,在构建对象时传输的文件的作用域就不再是Window对象了,而是Worker对象
self.onmessage = function(event){};
// 这里的作用域不再是Window对象,而是Worker对象
postMessage()方法传递的信息被保存在了事件对象中的data属性中,所以直接使用 event.data 就能够访问到传递的信息
onerror 事件
如果在Worker对象的执行过程中出现了报错,那么会产生onerror事件,这个事件对象中储存着与报错有关的信息
self.onerror = function(event){
event.filename // 发生错误的文件名
event.lineon // 错误代码行号
event.message // 错误信息
}
终止线程
从上面的讲述中可以知道,如果使用Worker就能够有两个作用域,一个是原生的Window对象,另一个是你在构造Worker对象是传递的文件中产生的Worker对象
终止线程在两个作用域中都提供了方法,Window中可以使用Worker.terminate()方法终止线程,在Worker中可以使用close()方法终止线程(说到底两者好像都差不多,反正都是Worker对象的方法,这个我也不做过多的研究了,接着往下看吧)
实例
// File: mian.js
var workerObj = new Worker('javascriptFile.js');
workerObj.postMessage(123);
workerObj.onmessage = function(event){
alert(evert.data.doubleNum);
};
// File: javascriptFile.js
self.onmessage = function(event){
self.postMessage({doubleNum:event.data*2}});
// 为了让 main.js 接收到处理的数据,所以再发送一条信息给 main.js
}
// Output: 246
如果还有不懂的可以加QQ群 : 921998494