【Promise】第五部分 async和await

导读:本篇文章讲解 【Promise】第五部分 async和await,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

【Promise】第五部分 async和await



5. async和await

5.1 mdn文档

async

await

5.2 async函数

  1. async 函数的返回值为 promise 对象

  2. promise 对象的结果由 async 函数执行的返回值决定

 // 和then的规则很像
        async function main (){
            // 1. 如果返回的值是非Promise对象则状态为成功,值为返回的值
            // return 123

            //2. 如果返回的值是Promise对象,则由该Promise对象决定返回结果和状态
            return new Promise((resolve,reject)=>{
                resolve('ok')
            })
        }

        let res = main()
        console.log(res)

5.3 await表达式

  1. await 右侧的表达式一般为 promise 对象, 但也可以是其它的值

  2. 如果表达式是 promise 对象, await 返回的是 promise 成功的值

  3. 如果表达式是其他值, 直接将此值作为 await 的返回值

  4. 需要注意:

    • await必须要写在async函数中,但是async函数中可以没有await
    • 如果await的Promise失败了,就会抛出异常,需要通过try…catch进行捕获
 // 和then的规则很像
        async function main (){
            let p = new Promise((resolve,reject)=>{
                resolve('ok')
            })

            let p1 = new Promise((resolve,reject)=>{
                reject('error')
            })

            // 1. 右侧为Promise对象,并且状态为成功
            let res = await p
            console.log(res)

            //2. 右侧为Promise对象,并且状态为失败
            // 状态为失败,await会抛出错误,需要try..catch进行捕获

            try {
                let res1 = await p1  
            } catch (e) {
                console.log(e)
            }

            //3. 右侧的值为其他值
            let res2 = await 'hhhh'
            console.log(res2) 
            
        }

        main()

5.4 async和await结合的例子

案例一: 读取多个文件

const fs = require('fs')
const util = require('util')
const miniReadFile = util.promisify(fs.readFile)

async function mian (){
    try{
        let data1 = await miniReadFile('./10-async和await.txt')
        let data2 = await miniReadFile('./11-读取文件.txt')
        let data3 = await miniReadFile('./12-发送ajax.txt')
        console.log(data1 + data2 + data3)
    }catch(e){
        console.log(e)
    }
}

案例二: 发送Ajax请求

<button class="btn">点击我发送请求</button>
    <script>

        function sendAjax(url) {
            return new Promise((resolve, reject) => {
                // 创建一个对象
                let xhr = new XMLHttpRequest()

                //设置接收类型
                xhr.responseType = 'json'

                // 初始化
                xhr.open('Get', url)

                //发送
                xhr.send()

                //对响应结果进行处理
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4) {
                        if (xhr.status >= 200 && xhr.status < 300) {
                            resolve(xhr.response.result[0].title)
                        }else{
                            reject(xhr.status)
                        }
                    }
                }
            })
        }

        const btn = document.querySelector('.btn')
        btn.addEventListener('click',async function(){
            let res = await sendAjax('https://api.apiopen.top/getWangYiNews')
            console.log(res)
        })
        

    </script>

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82909.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!