首先 JavaScript 是单线程,为了处理异步,I/O 等待状态等问题引入了事件循环机制。
- 代码由上往下顺序执行。
- 遇到宏任务(
XHR回调、事件回调(鼠标键盘事件)、setImmediate、setTimeout、setInterval、indexedDB数据库等I/O操作以及UI rendering
)将任务推进宏任务队列。 - 遇到微任务(
process.nextTick、Promise.then、Object.observer(已经被废弃)、MutationObserver(html5新特性)
)将任务推进微任务队列。 - 当主程序走完执行微任务队列再执行宏任务队列,循环往复。
例子:
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
网友评论