用await/async 替换 Promise then/catch/finally

2,267 阅读2分钟

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.更方便调试,不需要使用很多箭头函数,可以像调试同步代码一样。

如需转载,请标注出处和作者,谢谢🙏