ES6

es6--异步函数,async和await

2020-01-19  本文已影响0人  花拾superzay

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(); 
上一篇 下一篇

猜你喜欢

热点阅读