async是generator的语法糖。在函数内部使用await表示异步。
想较于 generator,async
函数的改进在于下面四点:
- 内置执行器。generator 函数的执行必须依靠执行器,而
async
函数自带执行器,调用方式跟普通函数的调用一样 - 更好的语义。
async
和await
相较于*
和yield
更加语义化 - 更广的适用性。
co
模块约定,yield
命令后面只能是 Thunk 函数或 Promise对象。而async
函数的await
命令后面则可以是 Promise 或者 原始类型的值(Number,string,boolean,但这时等同于同步操作) - 返回值是 Promise。
async
函数返回值是 Promise 对象,比 generator 函数返回的 Iterator 对象方便,可以直接使用then()
方法进行调用
缺点:错误处理时,如果有一个await执行出错那么后面的await都将不会执行。解决方案使用try catch进行捕获
let a;
async function correct() {
try { await Promise.reject('error') }
catch (error) { console.log(error); }
a = await 1; return a;
}