广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS异步的执行顺序分析
  • 184
分享到

JS异步的执行顺序分析

2024-04-02 19:04:59 184人浏览 八月长安
摘要

1.js的执行顺序,先同步后异步2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务Macrotask队列3.调用Promise 中的resolve,reject

  • 1.js的执行顺序,先同步后异步
  • 2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务Macrotask队列
  • 3.调用Promise 中的resolve,reject属于微任务队列,setTimeout属于宏任务队列

注意以上都是 队列,先进先出。

微任务包括 `process.nextTick` ,`promise` ,`MutationObserver`。

宏任务包括 `script` , `setTimeout` ,`setInterval` ,`setImmediate` ,`I/O` ,`UI rendering`。

node环境下,process.nextTick的优先级高于Promise,也就是可以简单理解为:在宏任务结束后会先执行微任务队列中的nextTickQueue部分,然后才会执行微任务中的Promise部分。

javascript事件机制

题目1:

console.log('script start') 
async function async1() {
  await async2()
  console.log('async1 end')
}
async function async2() {
  console.log('async2 end')
}
async1()
 
setTimeout(function() {
  console.log('setTimeout')
}, 0)
 
new Promise(resolve => {
  console.log('Promise')
  resolve()
})
.then(function() {
  console.log('promise1')
})
.then(function() {
  console.log('promise2')
})
 
console.log('script end')

执行结果?

分析:

首先执行 同步代码:

  • 1. 首先执行    console.log('script start')
  • 2. 执行 async1() 的时候,马上执行了 async2函数:console.log('async2 end')
  • 3. 顺序执行 new Promise()中的同步函数:console.log('Promise')
  • 4. 最后执行  console.log('script end')。

上面是同步执行的代码,然后看剩下的异步执行的代码:

首先,setTimeout是 宏观任务,排除到最后,剩下微观任务:

async function async1() {
  await async2()
  console.log('async1 end')
}
new Promise(resolve => {
  resolve()
})
.then(function() {
  console.log('promise1')
})
.then(function() {
  console.log('promise2')
})
  • 5. 然后根据先入先出的对列方式,先执行await async2() 后面阻碍的函数console.log('async1 end')
  • 6. 执行promise的resolve函数
new Promise(resolve => {
  resolve()
})

也就是接下来的两个then:console.log('promise1') ----console.log('promise2') ;

  • 7. 最后执行的是 setTimeout函数console.log('setTimeout') ;

综上所述,以上代码执行的顺序是:

1.script start >> 2.async2 end >> 3.Promise >> 4.script end >> 5.async1 end >> 6.promise1 >> 7.promise2 >> 8.setTimeout

题目2:

(function() {
 
    setTimeout(() => {
        console.log(0);
    });
 
    new Promise(resolve => {
        console.log(1);
 
        setTimeout(() => {
            resolve();
            Promise.resolve().then(() => console.log(2));
            console.log(3);
        });
 
        Promise.resolve().then(() => console.log(4));
 
    }).then(() => {
        console.log(5);
        Promise.resolve().then(() => console.log(8));
        setTimeout(() => console.log(6));
    });
 
    console.log(7);
 
})();
  • 1. 同样先执行同步代码,且先把setTimeout去掉:
new Promise(resolve => {
      console.log(1);
      Promise.resolve().then(() => console.log(4)); //微观任务
  }).then(() => {                  //then函数是执行对应的 resolve 的时候才执行的
      console.log(5);
      Promise.resolve().then(() => console.log(8));//微观任务
 }); console.log(7);

可以看出先执行:console.log(1);console.log(7);

  • 2. 执行微任务Promise.resolve().then(() => console.log(4));

代码变成了:

(function() {
  setTimeout(() => {
      console.log(0);
  });
  new Promise(resolve => {
      setTimeout(() => {
          resolve();
          Promise.resolve().then(() => console.log(2));
          console.log(3);
      });
  }).then(() => {
      console.log(5);
      Promise.resolve().then(() => console.log(8)); //这句是多加的
      setTimeout(() => console.log(6));
  });
})();

只剩下宏观任务(微观任务在宏观任务里,也就是宏观任务外面不在有微观任务了)

  • 3. 执行console.log(0);
  • 4.再执行 new Promise 中的 setTimeout,先执行里面的同步函数:console.log(3)
  • 5. 再执行上面的 resolve,对应的是下面的then函数:
then(() => {
      console.log(5);
      Promise.resolve().then(() => console.log(8)); //这句是多加的
      setTimeout(() => console.log(6));
 }

所以先执行console.log(5);

剩下的都是微观任务和宏观任务,先看微观任务:

new Promise(resolve => {
     resolve();
     Promise.resolve().then(() => console.log(2));
 }).then(() => {
     Promise.resolve().then(() => console.log(8));
     setTimeout(() => console.log(6));
 });

所以根据队列中的微观任务顺序先执行:console.log(2),在执行then中的console.log(8);

最后再执行 console.log(6)

综上所述,结果为

1/7/4/0/3/5/2/8/6

题目3:

(function() {
    setTimeout(() => {
        console.log(0);
    });
 
    new Promise(resolve => {
 
        console.log(1);
         
        setTimeout(() => {
            resolve();
            Promise.resolve().then(() => {
                console.log(2);
                setTimeout(() => console.log(3));
                Promise.resolve().then(() => console.log(4));
            });
        });
 
        Promise.resolve().then(() => console.log(5));
 
    }).then(() => {
 
        console.log(6);
        Promise.resolve().then(() => console.log(7));
        setTimeout(() => console.log(8));
 
    });
 
    console.log(9);
})();

解释如下:【同步>异步;微任务>宏任务】第一步:打印出1、9;如图

图a

由图a中的任务队列可知:
第二步: 执行微任务3,打印出5;
第三步:执行宏任务1,打印出0,
第四步:开始执行宏任务2;如图:

图b

第五步:由图b中的任务队列可知, 执行微任务4,打印出6,如图:

图c

第六步:由图c中的任务队列可知, 执行微任务5,打印出2;如图

图d

由图d的任务队列可知,
第七步:执行微任务6,打印出7;
第八步:执行微任务9,打印出4;
第九步:执行宏任务7,打印出8;
第十步:执行宏任务8,打印出3;

即答案是:

1-9-5-0-6-2-7-4-8-3

到此这篇关于JS异步执行顺序的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: JS异步的执行顺序分析

本文链接: https://www.lsjlt.com/news/152163.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS异步的执行顺序分析
    1.js的执行顺序,先同步后异步2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列3.调用Promise 中的resolve,reject...
    99+
    2022-11-13
  • JS异步的执行顺序是什么
    这篇文章主要介绍“JS异步的执行顺序是什么”,在日常操作中,相信很多人在JS异步的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS异步的执行顺序是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-02
  • JS下大批量异步任务按顺序执行的示例分析
    这篇文章主要介绍了JS下大批量异步任务按顺序执行的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言最近需要做一个浏览器的, 支持大...
    99+
    2022-10-19
  • Shell 管道及执行顺序分析
    1、基本概念 a、I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9; b、常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),...
    99+
    2022-06-04
    管道 顺序 Shell
  • Shell 命令执行顺序分析[图]
    Shell 从标准输入或脚本中读取的每一行称为管道(pipeline);它包含了一个或多个命令(command),这些命令被一个或多个管道字符(|)隔开。 事实上还有很多特殊符号可用来分隔单个的命令:分号(...
    99+
    2022-06-04
    顺序 命令 Shell
  • try catch finally的执行顺序深入分析
    首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分。 关于一个函数的执行过程是,当有return以后,函数就会把这个...
    99+
    2022-11-15
    try catch finally 执行顺序
  • MySQL中SELECT执行顺序的示例分析
    小编给大家分享一下MySQL中SELECT执行顺序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SELECT语...
    99+
    2022-10-18
  • MySQL语句执行顺序实例分析
    这篇文章主要讲解了“MySQL语句执行顺序实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL语句执行顺序实例分析”吧!1、SQL数据举例举例:有10个用户,输出在订单表中下单数...
    99+
    2023-06-30
  • Shell中管道及执行顺序的示例分析
    这篇文章主要介绍Shell中管道及执行顺序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、基本概念 a、I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9; b、常用FD有3个,为0(...
    99+
    2023-06-09
  • SQL查询语句执行顺序的示例分析
    这篇文章主要介绍SQL查询语句执行顺序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SQL查询语句执行顺序如下:(7) SELECT  (8)&...
    99+
    2022-10-18
  • 关于join on和where执行顺序分析
    目录join on和where执行顺序1、join中相比where优先推荐on2. 逻辑上一个query的执行顺序(不是实际) 扩展:SQL执行顺序join在where前面join...
    99+
    2023-03-06
    join on和where执行顺序 join on和where SQL执行顺序
  • 关于join on和where执行顺序分析
    目录join on和where执行顺序1、join中相比where优先推荐on2. 逻辑上一个query的执行顺序(不是实际) 扩展:SQL执行顺序jo...
    99+
    2023-03-06
    join on和where执行顺序 join on和where SQL执行顺序
  • JavaScript如何实现异步任务循环顺序执行
    今天小编给大家分享一下JavaScript如何实现异步任务循环顺序执行的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求场景...
    99+
    2023-07-05
  • JavaScript实现异步任务循环顺序执行详解
    目录一、错误的实现简单的错误实现使用 Promise.all 的错误实现二、正确的实现需求场景:数组的元素作为异步任务的参数,循环遍历该数组,并执行异步任务。 一、错误的实现 简单的...
    99+
    2023-03-19
    JavaScript异步任务循环顺序执行 JavaScript异步任务执行 JavaScript异步任务
  • mysql语句书写和执行顺序的示例分析
    小编给大家分享一下mysql语句书写和执行顺序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql语句的书写顺序和...
    99+
    2022-10-18
  • mybatis多个plugins的执行顺序解析
    目录一、前言二、准备工作、代码准备三、开始探索四、结论一、前言 在mybatis官网中,有插件一说 mybatis plugins 如果同时有多个插件,那么他们的执行顺序是怎样的? ...
    99+
    2022-11-12
  • &&、()、||决定linux命令执行顺序的示例分析
    小编给大家分享一下&&、()、||决定linux命令执行顺序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在执行某个命令时,有时需要依赖...
    99+
    2023-06-09
  • javascript之加载顺序与执行原理的示例分析
    这篇文章主要为大家展示了“javascript之加载顺序与执行原理的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript之加载顺序与执行原...
    99+
    2022-10-19
  • SQL查询语句的执行顺序解析
    SQL语句执行顺序 结合上图,整理出如下伪SQL查询语句。 从这个顺序中我们可以发现,所有的查询语句都是从 FROM 开始执行的。在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。...
    99+
    2021-04-08
    SQL查询语句的执行顺序解析
  • spring初始化方法的执行顺序及其原理分析
    目录Spring中初始化方法的执行顺序首先通过一个例子来看其顺序配置我们进入这个类看我们看到了annotation-config了我们重点看下这行代码我们直接看initializeB...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作