解决JS单线程执行

创建一个worker 对象并向它传递将在新线程中执行的脚本的URl

 

<!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>递归</title>
</head>
<body>
  <input type="text" id="number">
  <button id="btn">计算</button>
  <script>
    let input = document.getElementById('number')

    document.getElementById('btn').onclick = function (){
      let number = input.value

      // 创建一个worker 对象并向它传递将在新线程中执行的脚本的URl
      let worker = new Worker('./worker.js')

      // 接收worker 传过来的数据函数
      worker.onmessage = function (event) {
        console.log('主线程接收分线程返回的数据', event.data)
        alert(event.data)
      }
      
      // 向分线程发送信息
      worker.postMessage(number)
      console.log('主线程向分线程发送数据请求' + number)
    }

  </script>
</body>
</html>

新线程

function countNum(n) {
  return n <= 2 ? 1 : countNum(n - 1) + countNum(n - 2)   //----->递归调用
}
// 只能用函数表达式
var onmessage = function (event){
  var number = event.data
  // 通过event.data获得发送来的数据
  var result = countNum(number)
  // 返回数据给主线程
  postMessage(result)
  console.log('分线程返回数据给主线程' + result)
}

 Workers 是html5提供的一个JavaScript多线程解决方案

  1. 我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面

  2. 但是主线程完全受主线程控制,且不得操作DOM。

  3. 所以,这个新标准并没有改变JavaScript单线程的本质

  1. Worker:构造函数,加载分线程执行的js文件

  2. Worker.prototype.onmessage:用于接收另外一个线程的回调函数

  3. Worker.prototype.postMessage:向另一个现场发送消息

 不足

  1. worker内代码不能操作DOM(更新UI)

  2. 不能跨域加载JS

  3. 不是每个浏览器都支持这个新特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值