07WebWorker
2019-07-13 本文已影响0人
白雪公主960
由于浏览器中负责渲染/监听只有一个UI主线程,所有的HTML/CSS/JS的执行都在这一个线程内,若页面中加载了非常耗时(算法复杂)的JS操作,会阻塞后续的HTML/CSS/JS的渲染和事件监听。
如何解决?—— 创建一个新的并发线程来执行这样的耗时操作。
JS中没有创建新线程的方法,替代方案——Web Worker
var w = new Work( 'xx.js' );
含义:在当前UI主线程中创建并启动一个新的并发的工作线程,该线程执行耗时操作,可能阻塞;但不会对当前UI主线程产生影响。
注意:Worker线程的致命问题——不能执行任何DOM操作,不能使用任何DOM&BOM元素——浏览器中只允许UI主线程修改DOM树。jQuery之类的JS文件决不能使用Worker来执行!!
(1)如何让UI主线程给Worker线程传递数据:
UI主线程:
var w = new Work('xx.js');
w.postMessage('data');
Worker线程:
onmessage = function(event){
var data = event.data;
}
(2)如何让Worker线程把运算结果传递给UI主线程:
Worker线程:
postMessage('data');
UI主线程:
var w = new Worker('xx.js');
w.onmessage = function(event){
var data = event.data;
}
练习:UI主线程中读取用户输入,发送给Worker线程;Worker线程开始运算,完毕后,把运算结果发送回给UI主线程,显示在DIV元素中。