Web全栈探索,Vue基础系列,前后端交互(四)

async 和 await

async

该关键字放到函数前面、任何一个 async 函数都会隐式返回一个 promise

await

该关键字只能在使用 async 定义的函数中使用

await后面可以直接跟一个 Promise实例对象、await函数不能单独使用

1.async 和 await 的简单使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<script type="text/javascript" src="../js/axios.js"></script>
<script type="text/javascript">

    /*
      async/await 处理异步操作:
      async函数返回一个Promise实例对象
      await后面可以直接跟一个 Promise实例对象
    */

    // 方案一、普通访问方式
    axios.defaults.baseURL = 'http://10.5.34.66:8104';
    axios.get('/temp/string')
        .then(function(ret){
            console.log(ret.data)
        })



    // ===========================================================================================



    // 方案二、采用 async await 直接得到数据
    // async作为一个关键字放到函数前面
    // 任何一个async函数都会隐式返回一个promise
    async function queryData() {

        // await关键字只能在使用async定义的函数中使用,可以用于异步操作(await可以得到异步的结果)
        let ret = await axios.get('/temp/string');
        console.log(ret.data)
    }

    queryData()



    // ===========================================================================================



    // 方案三、采用 async await 结合 .then 进行异步访问(前后结果有依赖)
    // async作为一个关键字放到函数前面
    // 任何一个async函数都会隐式返回一个promise
    async function queryDataOne() {

        // await关键字只能在使用async定义的函数中使用,可以用于异步操作(await可以得到异步的结果)
        let ret = await axios.get('/temp/string');
        return ret.data;
    }

    // 任何一个async函数都会隐式返回一个promise 我们可以使用 then 进行链式编程
    // 将上一步的结果得到以后,才能继续执行此函数功能
    // 其中 data 就是上一步中返回的 ret.data 数据
    queryDataOne().then(function (data) {
        console.log(data)
    })



    // ========================================================================================



    // 方案四、使用 async await 结合 promise 进行异步操作(前后结果有依赖)
    // 任何一个async函数都会隐式返回一个promise
    async function queryDataTwo(url){
        let ret = await new Promise(function(resolve, reject){
            let xhr = new XMLHttpRequest();
            // 指定回调函数
            xhr.onreadystatechange = function(){
                // 服务器未完成响应
                if(xhr.readyState !== 4) return;
                // 请求成功,并成功返回
                if(xhr.readyState === 4 && xhr.status === 200) {
                    // 处理正常的情况
                    resolve(xhr.responseText);
                }else{
                    // 处理异常情况
                    reject('出错了');
                }
            };

            // 发送 get 方式的 ajax 请求
            xhr.open('get', url);
            xhr.send(null);
        });
        return ret;
    }

    // 任何一个async函数都会隐式返回一个promise 我们可以使用 then 进行链式编程
    queryDataTwo("http://10.5.34.66:8104/temp/string").then(function (data) {
        console.log(data)
    })
</script>
</body>
</html>

2.async 和 await 处理多个异步请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<script type="text/javascript" src="../js/axios.js"></script>
<script type="text/javascript">

    /*
      async/await处理多个异步任务
    */
    axios.defaults.baseURL = 'http://10.5.34.66:8104';

    async function queryData() {


        // 多个异步请求之间有顺序时,只需要用 await 标明即可,它自己会保证顺序执行

        // 函数处理多个异步函数
        // 添加 await 之后 当前的 await 返回结果之后才会执行后面的代码
        // 让异步代码看起来、表现起来更像同步代码
        let info = await axios.get('/temp');
        // 上一步完成以后,才会执行下一步
        // 根据上一步得到用户整个信息,然后利用用户的整个信息(axios得到的是对象)得到用户的id
        // 最后利用 id 结合后台相应的 controller 得到相应的资源
        let ret = await axios.get('/temp/' + info.data.id);
        return ret.data;
    }

    // 参数 data 为 queryData 函数执行后的结果
    queryData().then(function(data){
        console.log(data)
    })
</script>
</body>
</html>


 

作者:蓝月

-------------------------------------------

个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

原文地址:https://www.cnblogs.com/viplanyue/p/13573726.html