我们知道js是单线程的,如果把占用大量计算资源的代码,或者获取大量数据,耗时较多的请求分离出去,用一个单独的线程去处理,会不会提升页面的性能的,答案是肯定的,尤其是现在我们开发大多是单页应用,这种多线程的作用就会更加明显,那该怎么实现呢,以下是一个简单的示例:
1.准备两个文件,index.html 和 worker.js
index.html创建worker线程,并发送信息、监听信息,代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
// 创建worker
const worker = new Worker('./worker.js')
// 向worker线程发送消息
worker.postMessage('hello worker')
// 监听worker的message事件
worker.onmessage = function (e) {
console.log('主线程收到', e.data)
}
console.log('主线程执行完毕');
</script>
</html>
2. worker.js 则是我们的线程文件,里面做一些数据处理,数据请求等,执行完成后将内容发送给index.html
function ajax (url) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.responseText))
} else {
reject(xhr.status)
}
}
}
xhr.send()
})
}
// 获取主线程传值
this.onmessage = function (e) {
console.log('子线程收到', e.data)
// 向主线程发送数据
ajax("https://api.seniverse.com/v3/weather/now.json?key=SCYrvkytJze9qyzOh&location=北京").then(res => {
this.postMessage(res)
})
}
如果一切顺利,你将看到如下结果:
特别注意,你可能第一个遇到的问题会是这样:
这个问题原因很简单,浏览器拦截了这种操作,他认为是不安全的,所以需要本地起一个服务来运行index.html
不知道怎么起服务的,可以直接用vscode插件:live Server