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元素中。

总结:Worker用于执行耗时的JS任务,在一个独立的线程中,可以避免UI主线程的阻塞问题。
上一篇 下一篇

猜你喜欢

热点阅读