WebWorker出现之前,JavaScript只能单线程运行,网络IO等耗时操作通过异步回调的方式完成,这是由JavaScript最开始的用途决定的,如DOM操作等,多线程会带来复杂的同步问题。
然而,没有多线程支持实际上很多代码难以编写,比如一个长时间运行的后台逻辑。现在,WebWorker可以创建一个子线程,在后台执行耗时操作。
下面例子代码中,我们使用WebWorker创建一个子线程,并通过子线程向主线程发送消息:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>web worker demo</title>
</head>
<body>
<span id="count">0</span>
<script>
var w = new Worker("worker.js");
w.onmessage = function(event)
{
document.querySelector("#count").innerHTML = event.data;
}
</script>
</body>
</html>
worker.js
var i = 0;
function timedCount()
{
i = i + 1;
postMessage(i);
setTimeout("timedCount()", 500);
}
timedCount();
如上述代码,直接new Worker()就能创建一个WebWorker
对象,参数需要指定子线程JavaScript代码的url。主线程使用onmessage
回调接收消息并处理,子线程使用postMessage()
向主线程发送消息。