JS分为同步任务和异步任务
    同步任务在主线程执行
    异步任务放在主线程之外的一个任务队列。
    主线程执行完毕后,读取任务队列内容。

    主线程从任务队列中读取事件,这个过程是循环不断的,称为事件循环。即event loop。

    宏任务(macro)task:当前主线程上执行的就是一个宏任务。例: script 的代码、setTimeout、setInterval、postMessage等。
    微任务:microtask。例:Promise.then、await后面的代码。

    在执行当前宏任务时(同步执行时),遇到 setTimeout 会把它放到宏任务队列。遇到Promise.then会放到微任务队列。

    当前 宏任务 执行完毕后,会先查看微任务队列,如果有任务,优先执行,否则执行下一个宏任务。所以 promise.then 会先于 setTimeout执行。、

    案例1:

    1. console.log("aaa");
    2. setTimeout(function(){
    3. console.log("bbb");
    4. },0);
    5. Promise.resolve().then(function(){
    6. console.log("ccc");
    7. })
    8. console.log("ddd");
    9. //打印结果为:aaa ddd ccc bbb

    image.png

    案例2:

    1. setTimeout(function(){
    2. Promise.resolve().then(function(){
    3. console.log("bbb");
    4. })
    5. },0)
    6. Promise.resolve().then(function(){
    7. setTimeout(function(){
    8. console.log("aaa");
    9. },0)
    10. });
    11. //打印结果为:bbb aaa

    image.png