美文网首页
js 异步执行顺序

js 异步执行顺序

作者: 团子Secret | 来源:发表于2018-12-13 12:04 被阅读0次

某天中午午饭前,11:48分,钉钉突然闪动了起来。消息如下:


一张答对就有午饭的图片,ps: 12:00午饭.png

代码如下:

(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);

})();

那么打印顺序是咋样的呢?我们来好好分析一下。

(╥╯^╰╥)emmmm,被批评了解释的不够简单易懂,我残忍的删掉了一大段解释

这里本来有一大段关于上面那个题目的解释

我决定了,上面那题你们自己做,做对了,就请我吃一顿午饭!!!!!!!!!!!


那咱们来一个更加复杂的来分析分析
下题的打印顺序是啥?

(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. js的执行顺序,先同步异步
  1. 异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列

3.调用Promise 中的resolvereject属于微任务队列,setTimeout属于宏任务队列

解释如下:【同步>异步;微任务>宏任务】

第一步:打印出19 ;如图:

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

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

图c.png

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

图d.png

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

所以最终结果为:
1、9、5、0、6、2、7、4、8、3

深入理解【参考】

https://blog.csdn.net/qingwenxiutong/article/details/52397676

后记

回到最开头,那顿饭,emmmmmmmmm,我并没有吃上,当时看到这题就懵逼了。如果当初的我可以找到像我这篇这么完美的文章,我一定吃他个十碗饭,使无人敢再出题。

后后记

如果有帮到你,就点个小爱心吧 (╹▽╹)

相关文章

  • js 异步执行顺序

    js的执行顺序,先同步后异步异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask...

  • js 异步执行顺序

    某天中午午饭前,11:48分,钉钉突然闪动了起来。消息如下: 代码如下: 那么打印顺序是咋样的呢?我们来好好分析一...

  • js核心知识点系列——《js引擎运行机制》

    知识点: 刚接触js的时候,把js执行顺序划分为同步任务和异步任务两种,同步任务先执行完之后再去执行异步任务,然后...

  • js多个异步请求

    js js多个异步请求,按顺序执行next ES6 方法 参考https://www.cnblogs.com/7q...

  • js的eventLoop事件循环

    js代码是按顺序从上到下执行的,先执行同步任务,然后执行异步任务,那有两个或者更多异步任务的时候先执行哪个呢?这个...

  • Review JavaScript

    红宝书 综合 script加载js会阻塞渲染,标签中 fefer 指异步加载js,在文档load之后按顺序执行。a...

  • js实现“锁”

    在js中需要让某些异步的任务按顺序执行的时候可以Promise.then(Promise).then..... 但...

  • 异步顺序执行

    要求:异步耗时操作:ADC先完成,再完成DE,最后完成FGHI 1、任务组(DispatchGroup)实现 2、...

  • setTimeout、Promise、Async/Await 的

    1、JS是单线程语言,包括同步任务、异步任务,异步任务又包括宏观任务和微观任务 2、执行顺序:同步任务——>微观任...

  • 同步任务队列、宏观任务队列、微观任务队列

    1、JS是单线程语言,包括同步任务、异步任务,异步任务又包括宏观任务和微观任务 2、执行顺序:同步任务——>微观任...

网友评论

      本文标题:js 异步执行顺序

      本文链接:https://www.haomeiwen.com/subject/xgkvhqtx.html