博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一次性彻底了解js event loop 事件循环
阅读量:6486 次
发布时间:2019-06-23

本文共 3292 字,大约阅读时间需要 10 分钟。

js事件大致可以分为微任务,宏任务,同步任务,异步任务

1,微任务 Promise.then()  [非promise]   ,  process.nextTrick()    [node中]  等等...

2,宏任务  setTimeout()  html整体代码 setInterval()  等等...

3,异步任务  setTimeout()  setInterval() ajax请求  等等...

4,同步任务  [这个不知道怎么举例...]  

eg:    //微任务 - 同步任务    new Promise((resolve,reject)=>{   //tip:promise是同步任务        console.log(1);                       resolve();    })    .then(()=>{                        // promise.then()是微任务        console.log(2)    })    //打印结果    1;    2;        /*        首先我们先了解js执行机制,由于js是单线程任务,会有一个event loop循环机制,        所以会一步一步执行,        也就是队列,而执行时先执行宏任务,等到宏任务执行完执行在执行微任务,        例如上面的例子:        先将同步任务pormise放入队列执行[输出1] => 发现resolve(.then说你执行完了,该我了)                                                 同步任务执行完毕                                             => 执行微任务[输出2]    */复制代码

eg:    //异步任务 - 宏任务    console.log(1);        //同步任务    setTimeout(()=>{       // 宏任务-异步任务        console.log(2)    })    console.log(3)    /*        首先将console.log(1)放入event loop循环机制里 打印1         =>         发现宏任务,且宏任务是异步的,将setTimeout放入event loop循环中          =>                 发现同步任务console.log(3),将console.log(3)放入event loop执行,              并将同步任务放在异步任务之前执行  打印3        =>            同步任务执行完,异步任务,你们都完事了,该我了吧. 打印3            */复制代码

来看一道有趣的面试题

console.log(1);setTimeout(function(){    console.log(2)})new Promise(function((resolve,reject)=>{    console.log(3);}).then(()=>{    console.log(4)});/*       首先我们来分析下这道题,               发现事件,开启event loop循环机制        =>       先将console.log(1)放入event loop 循环机制中            =>                发现宏任务,将setTimeout放入event loop循环机制中,                发现宏任务setTimeout 是异步任务, 给他单独开条路,让他执行        =>            发现同步任务promise, 将同步任务放入event loop 循环机制中         打印结果依次为[1 => 3 => 2 ]        这里解释一下为什么微任务promise().then()没有执行        [在执行同步任务promise时,没有发现resolve()函数,因此无法继续向下执行,         promise()一直处于pedding状态,如果在同步任务promise()中加了resolve()函数         那么微任务promise().then()会执行,打印结果依次为[1 => 3 => 4 => 2]                   这样很多人会说,setTimeout不是宏任务吗? 不是宏任务先执行吗?             解释一下,setTimeout是宏任务但是他是异步任务,异步任务会等到线程上的任务都结束            之后才会输出.         ]        */复制代码

eg:    //下面看下这道题的进阶版本    console.log(1);   setTimeout(function(){       console.log(2);        new Promise((resolve,reject) =>{            console.log(3);            resolve();            console.log(4)        })        .then(()=>{            console.log(5)        })        })        console.log(6);    /*                第一步:发现事件 -> 开启event loop 事件循环机制         第二步:将同步任务console.log(1)放入event loop事件循环中  - >  [打印  1]        第三步:发现宏任务且是异步 -> 将setTimeout放入event loop事件循环中,                等到线程同步任务结束在开始执行            第四步:发现同步任务console.log(6),将同步任务console.log(6)放入event loop事件循环中 [打印6]        第五步:setTimeout异步宏任务发现js线程同步任务结束,终于轮到我执行了吧,将setTimeout放入js线程        第六步:执行setTimeout宏任务 首先发现同步任务 console.log(2)将其放入event loop事件循环机制中,        第七步:发现同步微任务promise(),将promise()放入event loop 事件循环中            第八步:进入promise()微任务 ,放入event loop事件循环中 ->  发现同步任务console.log(3) [打印3]                第九步:发现resolve() ->  promise().then()  可以向下执行        第十步:发现同步任务console.log(4),将其放入event loop事件循环中  [打印4]        第十一步:同步任务执行完,执行微任务promise().then() ->  [打印  ->  5]        第十二步:js 线程上没有任务,结束event loop 事件循环                至此结束, 打印结果依次为[ 1 -> 6 -> 2 -> 3 -> 4 -> 5    ]    */复制代码

至此,你明白了js event loop 事件循环了吗?

转载于:https://juejin.im/post/5c77a3f4f265da2d84109848

你可能感兴趣的文章
理解Linux系统/etc/init.d目录和/etc/rc.local脚本
查看>>
代码整洁之道
查看>>
svm 预测标签的概率输出
查看>>
SDK目录结构
查看>>
ActiveMQ(25):优化与建议
查看>>
使用Intelij Idea经过的坑
查看>>
微信 token
查看>>
【原创】JAVA通过过滤器防止脚本注入
查看>>
马哥linux第8周作业
查看>>
gnu autotools
查看>>
在AIX上增加文件系统空间
查看>>
svchost cpu占用率过高电脑卡死
查看>>
【中小企业经典案例分析一】基础架构描述
查看>>
Android进程间通信(IPC)机制Binder简要介绍和学习计划
查看>>
在git@osc上托管自己的代码
查看>>
软件架构师的职责范围谈
查看>>
计算思维与创新创业 课程 获批
查看>>
yum install 时遇到 HTTP 404 page not found错误
查看>>
细说五层网站架构
查看>>
Xen命令全集
查看>>