【Promise】第五部分 async和await

【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>

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值