async函数
概念
- async函数是generator的语法糖,对generator函数的改进有:
- async函数拥有内置的执行器,其执行和普通函数一致;而generator函数则需要调用next或者使用co模块
- 更好的语义,async表示函数里面有异步操作,await表示紧跟在后面的表达式需要等待结果
- 更广的适用性,await后面可以跟promise对象(返回该对象的结果),或者其他值(会自动转为立即resolved的promise对象),若是一个thenable对象,会将其等同于一个promise对象
- async函数返回的是promise,可以使用next继续下一步操作
- async函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句
- async函数内部的return返回值,会作为then方法回调的参数
- async函数内部抛出的错误,会导致返回的promise变为reject状态,然后抛出的错误对象会作为catch函数回调的参数
- async函数返回的promise对象,必须等到内部所有await后面的promise对象执行完,才会发生状态改变,执行then方法参数回调,除非遇到return或者抛出错误
- 若多个await语句不存在继发关系(依赖关系,比较耗时),最好让他们同时触发,比如使用Promise.all
- async内部的任何一个await后面的promise对象变为reject状态,那么整个async函数都会中断执行(async函数返回reject状态),除非:
- 将await语句放在try...catch里面
- 或者每个await语句的promise都跟个catch方法,处理该promise出现的错误
- await命令只能用于async函数中,否则会报错
- 将forEach方法的参数改为async函数,可能会得到错误的结果,因为参数函数内部的await是并发执行的,而不是原先的继发执行,正确是使用:
- for循环遍历数组
- 使用reduce方法,必须参数函数是async,函数内部有await(因为参数是async,所以第一步返回的结果是promise,需要用await等待操作结束),同时reduce方法也需使用await(因为最后的结果是一个promise)
- async函数将保留运行堆栈(事件循环原理)
- async函数的异常处理