async 和 await 浅析----(懂Promise的进!)
如果你暂时不明白promise,请不要看这边文章,建议去看别的文章。
两件事:
- async 做了啥?
- await在等啥?
async 做了啥?
async function fn1(){
return 123
}
function fn2(){
return 123
}
console.log(fn1()); // Promise{123}
console.log(fn2()); // 123
// fn1()返回的是promise对象,所以能够执行链式调用,上边return的数据,在这里能够取用
fn1().then((res)=>{
console.log('res',res)
})
// fn2()进行链式调用就会直接报错
fn2().then((res)=>{
console.log('res',res)
})
【答案】 被async 声明的函数,return的值会被自动包装成Promise对象,能够使用链式操作。
await 在等啥?
async function num1(){
console.log(1)
let a = await num2()
console.log(a)
console.log(3)
return a
}
function num2(){
console.log(2)
return 4
}
输出的顺序是 1 2 4 3 ----> 说明啥?—>说明以下几点:
- await后边是同步的话,不影响代码的执行顺序,从上到下,依次执行;
- await 后边的同步代码 执行完之后,会将后边代码return的值给 前边的 a ;
- await不会吧后边的函数自动转化成 Promise对象(像async那样);
》》》》那它究竟在等啥? 不是好多文章都说异步请求要放在await后边的嘛!
【答案】await 在等它身后的函数返回的Promise对象,注意,不是这个函数是一个promise对象,而是他返回的promise对象,言下之意就是 你必须保证num2()这个函数里边return 的是一个Promise对象。
不多说,上代码!
async function num1(){
console.log(1)
let a = await num2()
console.log('a',a)
console.log(3)
return a
}
function num2(){
return new Promise((resolve,reject)=>{
setTimeout(() => {
console.log(2)
resolve('异步请求')
}, 200);
})
}
num1().then((res)=>{
console.log('res',res)
})
输出的顺序是:1 2 a异步请求 3 res异步请求
仔细看这个代码的执行顺序,你会发现,异步变成了同步操作;并且所有的代码都按照顺序执行了,这里成功模拟了,异步执行变成同步执行。
最关键的就是在num2( ) 中 return的Promise((resolve,reject)=>{})
await 不是等的一个Promise的结果,它等的是一个Promise的对象,是一个有状态的Promise对象!而不是一个Promise的结果或者一个普通函数return的结果
如果你还是不懂,就记住这个固定写法吧。