EventLoop循环机制详解(微任务、宏任务与async-await)

川长思鸟来 2023-01-23 06:53 94阅读 0赞

https://www.jianshu.com/p/5b4c4756e461 图片引用

\#\#\# 单页应用 SPA
首先明晰两个概念:

宏任务和微任务

也称之为 task 和microtask ,微任务要先于宏任务执行

宏任务主要有:

script(整体代码)、setTimeout、setInterval、I/O、UI 交互事件、postMessage、MessageChannel、setImmediate(Node.js 环境)。

微任务主要有:

Promise.then、 MutationObserver、 process.nextTick(Node.js 环境)。

宏任务和微任务的区分:首先前端代码执行 都是依赖于浏览器 和 node 环境的 ,我们暂且称之为宿主。即在宿主可控的范围内的都属于宏任务,宿主线程的回调就是宏队列。

以下运行示例:

  1. console.log(1); //非异步 直接输出1
  2. setTimeout(function() { //异步 进入宏任务队列
  3. console.log(2);
  4. }, 0);
  5. new Promise(function(resolve) {
  6. console.log(3); //非异步 直接输出3
  7. resolve(Date.now());
  8. }).then(function() {
  9. console.log(4); //异步 进入微任务队列
  10. });
  11. console.log(5); //非异步 直接输出5
  12. setTimeout(function() { //异步 进入宏任务队列
  13. new Promise(function(resolve) {
  14. console.log(6); //局部非异步
  15. resolve(Date.now());
  16. }).then(function() {
  17. console.log(7);
  18. });
  19. }, 0);
  20. 第一遍 输出 1 3 5 后此时宏任务队列中存在 2 6/7 微任务队列存在4
  21. 按照微任务先于宏任务的原则 所以第四个输出4 第五个输出2 而第二个宏任务中存在局部非异步和一个微任务7
  22. 运行顺序:因此,最终的输出顺序为:1, 3, 5, 4, 2, 6, 7;
  23. 作者:腾讯IVWEB团队
  24. 链接:https://juejin.cn/post/6844904035770695693
  25. 来源:掘金

async-await

async-await 只是 Promise+generator 的一种语法糖而已。

  1. function A() {
  2. return Promise.resolve(Date.now());
  3. }
  4. async function B() {
  5. console.log(Math.random());
  6. let now = await A();
  7. console.log(now);
  8. }
  9. ——————————————————————————————————————————————重写为promise格式
  10. function B() {
  11. console.log(Math.random());
  12. A().then(function(now) {
  13. console.log(now);
  14. })
  15. }
  16. console.log(1);
  17. B();
  18. console.log(2);
  19. 按照之前 promise.then 归为微任务的规则 。由于非异步先执行的原则, 先输出1 ,随后进入函数B 区分随机数为非异步, now为微任务,
  20. 输出随机数,后输出2 ,最后输出微任务now
  21. 运行顺序:因此,最终的输出顺序为:1, 随机数,2,时间戳;

发表评论

表情:
评论列表 (有 0 条评论,94人围观)

还没有评论,来说两句吧...

相关阅读

    相关 任务任务详解

    微任务可以在实时性和效率之间做一个有效的权衡。 从目前的情况来看,微任务已经被广泛地应用,基于微任务的技术有 MutationObserver、Promise 以及以 Pro