async 本质上其实是generator函数的一层封装,是一个语法糖

async函数与generator函数的区别

1 内置了执行器 generator函数需要执行器才能被调用,而async函数是不需要的
2 更好的语义 async和await是需要一起配合使用的, async表明这是一个异步的方法或内部在调用一个异步的方法, await表明其后跟着的是一个异步任务, 只有当异步任务执行完成以后才会执行下一行代码, 否则就会一直阻塞在那里, 知道异步任务的结束
3 更广的适用性 co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。 更易于对异步函数的封装
4 返回值是promise对象 返回值更加统一,更便于操作

async的错误处理

由于await 处理的promise 只接受resolved 而reject不会被处理 所以需要使用try…catch来进行异常的捕获
多个await 只需要一个 try…catch 来捕获异常

封装promise 统一处理error

对promise函数进行一层封装 通过新的promise函数的resolved来处理调用的promise 可以做到对await的统一处理 函数更加的像一个同步函数了

1
2
3
4
5
6
7

const query = function(){
return new Promise((resolved)=>{
axios.ther((res)=>resolved(res)).catch(err=>resolved(err))
})
}

上述代码仅供参考,不做实际用途

参考文档