? ?JS最大的特点就是单线程,所以他同一时间只能做一件事情。使单线程不阻塞,就是事件循环。
在JS当中分为两种任务:
事件循环就是不断重复上面两步骤、异步与同步任务执行如下。
? ? ? ? 异步任务又分为宏任务和微任务。
常见的微任务有:
常见的宏任务有:
他的运行机制是:
? ? ?async是异步的意思,await可以裂解为async wait。所以可以理解为:
Async/Await相对于Promise的优势:
function f() {
return Promise.resolve('TEST');
}
// asyncF is equivalent to f!
async function asyncF() {
return 'TEST';
}
async function fn1 (){
console.log(1)
await fn2()
console.log(2) // 阻塞
}
async function fn2 (){
console.log('fn2')
}
fn1()
console.log(3)
//1,fn2,3,2
? ? ? ? ?上面例子中,await会阻塞下面的代码(即加入微任务队列),先执行async外面的同步代码,执行完毕之后回到async函数执行之前阻塞的代码。
? ? ?下面一个案例可以看到时间循环机制为了达到单线程不阻塞,他的执行流程是怎么样的。
async function async1() {
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2')
}
console.log('script start')
setTimeout(function () {
console.log('settimeout')
})
async1()
new Promise(function (resolve) {
console.log('promise1')
resolve()
}).then(function () {
console.log('promise2')
})
console.log('script end')
//script start,async1 start,async2,promise1,script end,async1 end,promise2,settimeout
?分析:
script start
、async1 start
、async2
、promise1
、script end
async1 end
、promise2
处理宏任务队列打印
settimeout