标签:postMessage 对象 JavaScript Worker js 线程 多线程 event
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
标签:postMessage,对象,JavaScript,Worker,js,线程,多线程,event 来源: https://blog.csdn.net/qq_45940395/article/details/106457471
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。