事件循环机制 - EventLoop

首先 JavaScript 是单线程,为了处理异步,I/O 等待状态等问题引入了事件循环机制。

  1. 代码由上往下顺序执行。
  2. 遇到宏任务(XHR回调、事件回调(鼠标键盘事件)、setImmediate、setTimeout、setInterval、indexedDB数据库等I/O操作以及UI rendering)将任务推进宏任务队列。
  3. 遇到微任务(process.nextTick、Promise.then、Object.observer(已经被废弃)、MutationObserver(html5新特性))将任务推进微任务队列。
  4. 当主程序走完执行微任务队列再执行宏任务队列,循环往复。

例子:

async function async1() {
    console.log("async1 start")
    await async2()
    console.log("async1 end")
}

async function async2() {
    console.log("async2")
    return new Promise((resolve, reject) => {
        resolve();
        console.log("async2 Promise")
    })
}

console.log("strat")

setTimeout(function () {
    console.log("setTimeout")
}, 0)

async1();

new Promise(resolve => {
    console.log("Promise")
    resolve()
}).then(() => {
    console.log("Promise then")
})

console.log("end")

答案:

strat
async1 start
async2
async2 Promise
Promise
end
Promise then
async1 end
setTimeout

你可能感兴趣的:( 事件循环机制 - EventLoop)