1、js中的代码执行顺序是先同步再异步。
2、异步执行队列中又分为宏任务队列和微任务队列,微任务队列先于宏任务队列执行。
3、setTimeout()属于宏任务队列,new Promise()中的resolve()和reject()属于微任务队列。
举例看下异步执行队列是怎样的一种情况,代码参考的是团子Secret博主写的代码。如有侵权,请及时联系删除。
链接:https://www.jianshu.com/p/ca480f9e7dea
(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);
})();
初看代码真的是一脸懵逼,既有定时器,又有promise,无从下手。
首先可以确定的是,遇到setTimeout()这种的肯定是异步执行的,会放到异步执行队列的宏任务队列中,所以第一个setTimeout()肯定不是第一个结果。
往下面,在new Promise()中有一个console.log(1),这个肯定是第一个直接输出的,毫无疑问。往下又来了个setTimeout(),加入到异步执行队列的宏任务队列中,再往下出现Promise.resolve().then(() => console.log(5)),加入到异步执行队列的微任务队列中。在代码最后面还有个console.log(9),直接输出,所以这一段代码初步的执行情况是这样:

1.输出1、输出9;
2.把第一个setTimeout()加入到宏任务队列,命名为1;
3.把第二个setTimeout()加入到宏任务队列,命名为2;
4.把Promise.resolve().then(() => console.log(5))加入到微任务队列,命名为3
5.执行微任务3,输出5;
6.执行宏任务1,输出0;
7.执行宏任务2。

8.宏任务2中先执行resolve(),resolve()加入到微任务队列,命名为4;
9.又出现Promise.resolve(),加入到到微任务队列,命名为5;
10.执行微任务4,输出6;

11.微任务4执行过程中又添加了微任务6、宏任务7;
12.微任务4执行结束,执行微任务5,首先输出2;

13.执行过程中又添加了宏任务8、微任务9;
14.执行微任务6,输出7--->执行微任务9,输出4--->执行宏任务7,输出8--->执行宏任务8,输出3;
最终完整的执行结果是:1 9 5 0 6 2 7 4 8 3