机制如下:



宏任务后的微任务队列执行完后执行下一个宏任务;

宏任务

  • I/O,事件队列中的每一个事件都是一个macrotask
  • setTimeout / setInterval
  • MessageChannel是通信渠道API,ie11以上和其它浏览器支持。
  • setImmediate 目前只有IE10以上实现了该方法其它浏览器不支持.作用回调功能,node支持。
  • requestAnimationFrame 也算宏任务 node不支持。

微任务包括

  • Promise.then catch finally
  • MutationObserver 浏览器支持 IE11以上 node不支持,它会在指定的DOM发生变化时被调用
  • process.nextTick 浏览器不支持 node支持

async函数在await之前的代码都是同步执行的

案例

async function async1() {
    console.log("async1start");
    await async2();
    console.log("async1end")
}
async function async2() {
    console.log("async2")
}
console.log("scriptstart");
setTimeout(function () {
    console.log("setTimeout")
},0);
async1();
new Promise(function (resolve) {
    console.log("promise1");
    resolve()
}).then(function () {
    console.log("promise2")
});
console.log("scriptend");
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout