通过加载一个网络脚本文件,进而创建一个独立的线程、在主线程之外运行,其原理是在当前的主线程中,使用worker类创建一个新的线程,不阻塞主线程,并被主线程控制。通过子线程和主线程通信的方式进行数据的交互
JS为什么是必须是单线程而不是多线程的问题?
JS作为一个浏览器脚本语言他的主要作用就是为了进行页面的渲染和同用户进行交互操作DOM,这个就决定了它只能是单线程,避免同步带来的问题;比如说 当一个线程要在某个节点上添加一个内容,但是另一个线程是要删除这个节点,这个时候如果是多线程的就会造成混乱。 但是现在提出了webWorker的一个内容,允许脚本创建多个线程,但是子线程又完全被主线程控制,且不得操作DOM 元素
异步和webworker的区别是什么?
异步主要是当主线程在进行处理的时候,遇到同步的就直接运行,如果遇到异步的就将异步的方法放到事件队列中,当主线程中所有的同步任务处理完成之后,再进行异步任务的处理,这也就是为什么会出现setTIme 0 设定了时间之后不是立即执行了。 他们的一个主要的区别是:异步任务实质上是在主线程上进行处理的,而webworker是创建了一个新的子线程进行处理。
为什么需要异步 ?
如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验
那么webWork所创建的这个线程的主要的功能是什么呢?
主要是负责处理一些数据的问题,比如请求数据,他并不可以对DOM进行操作,他和主线程所在的上下文并不一致,而且他只能够处理网络请求的文件 无法处理
主要的应用场景
在大屏展示的时候,需要轮对数据进行请求操作,但是主线程还需要负责和用户进行交互的时候,当接收到子线程接收到后端返回的数据之后,发送消息给主线程,然后主线程进行具体的处理操作
实质
webwork 实质上只是主线程的子线程,并没有完全的脱离主线程的控制,并没有I/o的操作权限,只能是未主线程分担一些计算的任务
【基本使用】juejin.cn/post/722624…