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')
}, 0)
async1()
new Promise(function ( resolve ) {
console.log('promise1')
resolve();
}).then(function () {
console.log('promise2')
})
console.log('script end')
JS的执行机制
- 执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的【事件队列】里
- 当前宏任务执行完成后,会查看微任务的【事件队列】,并将里面全部的微任务依次执行完
宏任务和微任务的划分方式
- macro-task(宏任务):整体代码script,setTimeout,setInterval
- micro-task(微任务):Promise,process.nextTick
async在做什么事情?
带 async 关键字的函数,它使得你的函数的返回值必定是 promise 对象,如果async关键字函数返回的不是promise,会自动用 Promise.resolve()
包装。如果async关键字函数显式地返回promise,那就以你返回的promise为准。
async function fn1(){
return 123
}
function fn2(){
return 123
}
console.log(fn1())
console.log(fn2())
await在等什么?
await等的是右侧「表达式」的结果
也就是说,右侧如果是函数,那么函数的return值就是「表达式的结果」。
右侧如果是一个 'hello' 或者什么值,那表达式的结果就是 'hello'。
async function async1() {
console.log( 'async1 start')
await async2()
console.log( 'async1 end')
}
async function async2() {
console.log('async2')
}
async1()
console.log( 'script start')
是从左向右执行,一旦碰到await直接跳出,阻塞 async2()
的执行?
还是从右向左,先执行async2后,发现有await关键字,于是让出线程,阻塞代码呢?
实践的结论是,从右向左的。先打印async2,后打印的 script start
。
await 等到之后,做了一件什么事情?
- 不是promise对象
- 是promise对象
如果不是 promise , await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为 await表达式的结果。
如果它等到的是一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。