11.async的用法

200 阅读2分钟

async的作用

作用: 使得异步操作更加方便
async:它会返回一个Promise对象,一个async异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。
await关键字只在异步函数内有效。如果你在异步函数外使用它,会抛出语法错误。
注意: 当异步函数暂停时,它调用的函数会继续执行(收到异步函数返回的隐式Promise)。

async函数与Promise、Generator函数一样,是用来取代回调函数、解决异步操作的一种方法。它本质上是Generator函数的语法糖。
三者共同的作用:
1. 解决回调地狱
2. 使得异步操作显得更加方便
async function fun() {
    //await使函数停止等待,知道遇到return为止,将结果返回
    return await 'hello async';//async会将这个字符串转成Promise对象
}

fun().then(value => {
    console.log(value);//hello async
}).catch(err => {
    console.log(err);
});

多个await命令

如果async函数中有多个await,那么then函数会等待所有的await指令运行完之后的结果,才去执行。

    async function fun() {
        let str = await 'hello async';
        let data = str.split('');
        return data;
    }

    fun().then(value => {
        console.log(value);//["h", "e", "l", "l", "o", " ", "a", "s", "y", "n", "c"]
    }).catch(err => {
        console.log(err);
    });

如果多个await中有一个后面跟Promise.reject()操作,此时运行到这个Promise.reject()后就不会再继续往下执行。

async function fun() {
    await Promise.reject('错误');
    return await Promise.resolve('hello async');
}

fun().then(value => console.log(value)).catch(err => console.log(err));//错误

解决:

async function fun() {
    try {
        await Promise.reject('错误');
    } catch (e) {
        
    }
    return await Promise.resolve('hello async');
}

fun().then(value => console.log(value)).catch(err => console.log(err));//hello async

案例

获取天气接口中现在now的数据:

const getJSON = function (url) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.onreadystatechange = handler;
        xhr.responseType = 'json';
        xhr.setRequestHeader('Accept', 'application/json');
        //发送
        xhr.send();

        function handler() {
            //console.log(this);
            if (this.readyState === 4) {//0表示初始化,1表示还没发送,2、3表示当前进行中,4表示完成
                if (this.status === 200) {//200表示成功
                    resolve(this.response);
                } else {
                    reject(new Error(this.statusText));
                }
            }
        }
    })
};

async function getNowWeather(url) {
    //发送ajax获取实况天气
    let res = await getJSON(url);
    console.log(res);
    //获取HeWeather6的数据
    let weather = res.HeWeather6;
    console.log(weather);
    return weather[0].now;
}

getNowWeather('https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976').then(now => {
    console.log(now);
})