当前位置: 首页 > article >正文

js的事件轮询机制

js事件轮询:

1、js 是一门单线程语言,从上往下执行的,首先,主线程读取js代码,此时是同步的环境
2、当主线程检测到异步操作,就会交给其他异步线程处理,然后继续执行主线程的的任务
3、异步任务执行完毕之后,判断异步任务的类型,异步任务可分成宏任务和微任务,像setTimeout、setInterval属于宏任务,promise.then属于微任务,不同的任务进入不同的队列,等待主线程空闲时候调用。
4、当主线程的的同步任务执行完毕之后,开始执行微任务队列里面的所有微任务,执行完微任务,就执行宏任务队列里面所有的宏任务
5、执行完成之后,主线程开始询问任务队列里面是否还有等待的任务,如果有则进入主线程继续执行

以上步骤重复执行就是事件轮询

js将异步队列里的任务划分为宏任务和微任务
宏任务有:1)setTimeout, setInterval, setImmediate,2)I/O、3)、UI rendering等
微任务有:1)process.nextTick、2)Promise、3)Object.observe(已废弃)、4)MutationObserver(html5新特性)等

举个例子
console.log('script start')
setTimeout(function(){
    console.log('setTimeOut')
}, 0)

new Promise(function(resolve){
    console.log('promise1') 
    resolve()
}).then(function(){
    console.log('promise2') 
})
console.log('script end') 

流程如下:
1、打印script start,

2、遇到setTimeout放到宏任务队列里

3、打印promise1

4、将.then回调放入微任务队列里

5、打印script end

6、执行栈已清空,执行微任务队列打印promise2

7、微任务队列已清空,执行宏任务队列setTimeOut

8、所有任务队列清空

(如果还有任务的话则继续轮询 微任务 => 宏任务 => 微任务 => 宏任务…)

promise里的是同步代码,.then里的才是异步的

 在实际开发中,经常会有轮询的效果。

1、js实现轮询效果==>使用setTimeout,clearTimeout方法

复制代码
function setTimer () {
    let timer = null
    axios.post(url, params).then(res=>{
        if(res){//根据返回状态判断
            timer = setTimeout(()=>{
                   this.setTimer ()
                },2000)//2秒查一下
        }else{
            clearTimeout(timer);//清理定时任务
        }
    })
    .catch((error)=> {
            console.log(error);
       });
}
复制代码
2.HTML5推出新的对象:websocket
js setInterval+setTimeout定时器轮询+终止轮询
常见的轮询方式:
window.timer = setInterval(()=>{
     this.promiseFun()
 },1000)
大家一般都会使用setInterval,但要注意单纯使用它可能导致页面卡死。
原因是setInterval不会清除定时器队列,每重复执行1次都会导致定时器叠加,卡死。但是setTimeout是自带清除定时器的所以可以叠加使用。

更好的轮询方式
window.timer = setInterval(() => {
  setTimeout(this.promiseFun(), 0)
}, 1000)
结束轮询
在需要结束轮询的时候,如果是vue可以在beforeDestroy生命周期函数中销毁定时器 
clearInterval(timer)


http://www.kler.cn/a/2602.html

相关文章:

  • 1688平台商品关键词搜索的多样性与Python爬虫应用实践
  • 决定系数(R²分数)——评估回归模型性能的一个指标
  • 用OpenCV实现UVC视频分屏
  • docker minio镜像arm64架构
  • QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?
  • 《Spring Framework实战》4:Spring Framework 文档
  • PHP二维数组去重(指定键名)删除重复元素
  • <Linux>进程地址空间
  • C语言-程序环境和预处理(2)
  • YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)
  • 【JavaEE】线程的状态
  • 米哈游春招算法岗-2023.03.19-第一题-交换字符-简单题
  • [Python图像处理] 基于离散余弦变换的图像去噪
  • 计算机网络学习1
  • Django 实现瀑布流
  • EventLoop(回顾)
  • JVM系统优化实践(11):GC如何搞垮线上系统
  • Unity脚本类 ---- Input类,虚拟轴与插值方法
  • 第四季新星计划即将开启,博客之星取消拉票你怎么看?
  • 音乐制作:Ableton Live 11 Suite Mac
  • 全面比较Aptos和Sui:Aptos已上线 来看看Sui
  • 56 | fstab开机挂载
  • 【刷题之路Ⅱ】牛客 NC107 寻找峰值
  • 01. Vue核心 Vue简介 初识
  • 智能灯泡一Homekit智能家居系列
  • 【算法题】2191. 将杂乱无章的数字排序