async/await 是基于Promise的解决异步的最终方案。
一、async
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。
// async基础用法
async function handleData() {
console.log('a')
return 'a'
}
handleData.then(item => {
console.log(item) // 1,1
})
二、await
await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。 使用await只能获取到resolve的值,而reject的值是获取不到的。
await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。
async function handleData1() {
let a = await 11;
let b = await new Promise((resolve,reject)=>{
setTimeout(function(){
resolve('setTimeout3000')
},3000)
})
let c = await function1(){
return 'function1'
}()
console.log(a,b,c)
}
handleData1(); // 3秒后输出: 11 "setTimeout3000" "function1"
三、then
接收两个方法作为参数,第一个参数是成功的回调,第二个参数是失败的回调。
四、catch
相当于 then(undefined, onRejected)catch方法拥有一个参数。
五、finally
finally 方法用来指定在 promise 结束时,无论结果是 fulfilled 或者是 rejected,都会执行的回调函数;finally方法的回调函数不接受任何参数。
async/await的使用方法
// 使用async/await获取成功的结果
// 定义一个异步函数,3秒后才能获取到值(类似操作数据库)
function getSomeThing(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('获取成功')
},3000)
})
}
async function test(){
let a = await getSomeThing();
console.log(a)
}
test(); // 3秒后输出:获取成功
// 在开发过程中还可以这样调
async function() {
const {id} = await getUserInfo();
if (id) {
const res = await getList();
}
}
六、为什么要这样使用(优点)
1.代码简介,不用再使用then()进行包裹,类似也同步代码,逐行编辑写代码即可,提高可读性。
2.如果后台返回的httpcode非200,同时又想处理里面的数据,必须在.catch()中进行处理。
3.async和await,把异步执行的代码写得像同步代码那样直观。async的函数中可以有一个或多个异步操作,一旦遇到await就会立即返回一个pending状态的Promise对象,暂时返回执行代码的控制权,使得函数外的代码得以继续执行,这是保证非阻塞的部分。
4.更方便调试,不需要使用很多箭头函数,可以像调试同步代码一样。
如需转载,请标注出处和作者,谢谢🙏