async函数也是用来解决异步编程的书写问题,比promise更简洁,它把异步代码的书写方式简化的几乎和同步代码书写方式一样。
async异步函数内部有一个await关键字(也可以称为await指令)。async函数的返回值是一个promise实例,在async函数执行时首次遇到return或者await关键字后返回。
await关键字后面跟的是一个变量(也可说是一个值,这里假设为a),如果该变量的值是一个promise对象,则中断执行保持等待,当该promise对象resolve后,继续向下执行。如果该变量的值不是promise实例,则使用Promise.resolve(a)的形式包装该变量。
很多时候我们看到await后面跟的是一个语句,等于接受语句的返回值,即先执行语句,然后await关键字等待的是语句的返回值,如果语句没有返回值则为undefined
await关键字会返回值,我们可以使用一个变量来接收。返回值就是其后跟的promise实例resolve的参数。
如果await关键字后的promise实例的reject执行了(假设有参数arg),那么async函数中断执行,同时async函数返回的promise实例的reject执行,并接收参数arg。需要注意,如果await后的promise实例reject了,而async函数返回的promise实例没有注册失败回调,浏览器会报错(实测chrome浏览器会报错)
async函数在执行中遇到return语句时会退出函数的执行。如果函数执行到最后的代码都没有遇到return语句,则系统会在最后自动加上return undefined。这时async函数返回的promise实例的resolve或者reject就会执行。如果return一个非promise实例,则执行resolve,并接收return出的值为参数。如果return一个promise实例,则变成了状态关联。
//定义异步函数h
async function h() {
//创建一个promise实例
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ssss')
}, 5000)
})
//等待promise完成
let b = await promise; //定义变量b接收await的返回值,
setTimeout(() => {
console.dir(b + 1000); //打印ssss1000
}, 5000)
}
//调用函数h
//返回值是一个promise实例
let a = h();