JavaScript多线程--Worker对象基础

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章