当前位置:网站首页>JS异步的执行顺序是什么
JS异步的执行顺序是什么
2022-06-21 19:59:00 【亿速云】
JS异步的执行顺序是什么
这篇文章主要介绍“JS异步的执行顺序是什么”,在日常操作中,相信很多人在JS异步的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS异步的执行顺序是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
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异步的执行顺序是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
边栏推荐
- N - string problem HDU - 3374 (max min notation template)
- 2022 National latest fire facility operator (intermediate fire facility operator) simulation question bank and answers
- Why does defer not execute after the program exits
- 搭建Eureka-Server集群
- 可以在网上炒股开户吗?是安全的吗
- 哪些ipad的APP可以很好的阅读英文文献?
- Cocoapods installation (after xcode8.0, the infinite card is in the setting up cocoapods master repo)
- Revenue and profit "ebb and flow", water drops turn in pain
- 杰理之SD 卡复用 iic 注意问题【篇】
- Trend media Hypebeast plans to be listed on the curve: with a price of USD 530million, it is planned to be completed in the third quarter
猜你喜欢

15 iterator

Fm5012d small fan integrated IC scheme

免费又好用的参考文献管理软件zotero该怎么使用?可以同时支持中文和英文吗?...
![Time modification method for search device of Jerry's Bluetooth transmitter [chapter]](/img/ac/5a1d8cabbc61b24d451753e2f5c8dd.png)
Time modification method for search device of Jerry's Bluetooth transmitter [chapter]

js的对象操作(与c的对象比较简单的多)

科研漫画 | 看图可以学脑电,来试试?

#15迭代器
![VLAN division based on interface: static VLAN [not perfect]](/img/ba/968b483c3ed96b283aa263dcb0ccdc.png)
VLAN division based on interface: static VLAN [not perfect]

怎样有效率地进行外文文献检索?

JS object operation (much simpler than C object)
随机推荐
Tx9116 Synchronous Boost IC
怎样有效率地进行外文文献检索?
The latest simulation test questions and answers of Henan construction electrician (special construction operation) in 2022
杰理之做蓝牙发射时,将立体声修改成单声道差分输出时,接收端出现卡音【篇】
VLAN division based on interface: static VLAN [not perfect]
你真的了解二叉树吗?(上篇)
Improve four performance! D-wave releases next generation quantum annealing prototype
Yb5212a charging IC chip sop8
Revenue and profit "ebb and flow", water drops turn in pain
JS里的数据类型(基础)
Data processing and visualization of machine learning [iris data classification | feature attribute comparison]
华为鸿蒙开发第三课
Time modification method for search device of Jerry's Bluetooth transmitter [chapter]
12. signal foundation
杰理之配对成对耳后,想保持两个耳机都输出立体声【篇】
OpenJudge NOI 1.13 45:十进制到八进制
K - Clairewd’s message HDU - 4300 (EXKMP)
JS object operation (much simpler than C object)
Constructor in JS (emphasis)
潮流媒体Hypebeast拟曲线上市:作价5.3亿美元 拟第三季完成