js的异步执行队列

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.png

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。


异步执行队列2.png

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


异步执行队列3.png

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


异步执行队列4.png

13.执行过程中又添加了宏任务8、微任务9;
14.执行微任务6,输出7--->执行微任务9,输出4--->执行宏任务7,输出8--->执行宏任务8,输出3;

最终完整的执行结果是:1 9 5 0 6 2 7 4 8 3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容