- async、await是消灭异步的终极办法
- 和promise相辅相成
- 执行async函数,返回的是Promise对象
- await相当于Promise的then
- try…catch可以在async中捕获异常,相当于promise的catch
async函数返回的是Promise对象
async function fn(){
// 相当于return Promise.resolve(100)
return 100
}
const res = fn()
console.log(res) // Promise {<fulfilled>: 100}
res.then(data=>{
console.log("data",data)
})
await相当于Promise的then
async function fn(){
return 100
};
(async function(){
const res = await fn()
console.log(res) //100
})()
(async function(){
const p1 = Promise.resolve(100)
const a = await p1 //await相当于promise的then
console.log('a', a) // a 100
})()
(async function(){
const data1 = await 200 //await Promise.resolve(200)
console.log('data1', data1) // data1 100
})()
示例:
打印结果:o 1 3 100 2async function foo(){
console.log(1)
let a = await 100;
console.log(a);
console.log(2)
}
console.log("o")
foo();
console.log(3)
结果流程图分析async/await的执行流程
首先执行console.log(“o”),打印o。然后执行foo函数,由于foo函数被async标记,所以进入该函数时,js引擎会保存当前调用栈信息,然后执行foo函数中的console.log(1)。
遇到了foo函数内的await 100,此时进入分析重点。在执行await 100语句时,js引擎默认创建了Promise对象,代码如下
创建_promise对象过程中,可以看到内部调用了resolve函数,js引擎会将该任务交给微任务队列。然后js引擎会暂停当前协程执行,将主线程的控制权转交给父协程,同时将_promise对象返回给父协程。let _promise = new Promise((resolve,reject){
resolve(100);
})
接着继续执行父协程的任务,即执行console.log(3)。这时父协程任务执行结束,在结束之前进入到微任务检查点,开始执行微任务队列。微任务队列有resolve(100)的任务等待执行,执行到这里就触发_promise.then中的回调函数
foo协程激活后,会把value赋值给变量a,然后foo协程继续执行后续代码,执行完成将控制权交还给父协程。_promise.then(value=>{
// 回调函数被激活后
// 将主线程控制权交给foo协程,并将value值传给foo协程
})
try…catch捕获错误
(async function fn(){
const p1 = Promise.reject('async err') // reject在async中必须使用try..catch才能捕获到
try{
const res = await p1
console.log(res)
}catch(err){
console.error(err)
}
})()
面试题
async的题目
```javascript async function async1(){ console.log(‘async1 start’) //2 await async2() //之后的代码是异步回调内容 console.log(‘async1 start’) //5 }
async function async2(){ console.log(‘async2’) //3 }
console.log(‘script start’) // 1 async1() console.log(‘script end’) //4
<a name="cCney"></a>
#### setTimeout、promise、async结合的题目
```javascript
async function async1() {
console.log('async1 start') //2
await async2() //微任务
console.log('async1 end') //6
}
async function async2() {
console.log('async2') //3
}
console.log('script start') //1
setTimeout(function(){ //宏任务
console.log('setTimeout') //8
},0)
async1()
new Promise(function(resolve){
console.log('promise1') //4
resolve() //微任务
}).then(function(){
console.log('promise2') // 7
})
console.log('script end') //5
- 先同步代码执行,执行完毕,【event loop的call stack调用栈清空】
- 执行微任务队列中的任务microTask
- 有可能触发DOM渲染更新
- 执行宏任务macroTask