es8 async和await

async

        async function text() {
            console.log("aaaa")
        }
        let res = text()
        console.log(res)

先简单写一个async
在这里插入图片描述
这里看到async函数返回了一个Promise对象,而且在没有返回值的情况下,Promise的状态是fulfilled。

        async function text() {
            // console.log("aaaa")
            return new Promise((resolve,reject) => {
                // resolve("success111")
                reject("err222")
            })
        }
        let res = text()
        console.log(res)
        res.then(res =>{
            console.log("success",res) 
        }).catch(err => {
            console.log("err",err) //err err222
        })

根据上面的代码,发现根据async函数返回的Promise对象返回的是resolve还是reject执行then或者catch。

await

先写一个没什么意义的await来验证一下await可以接非Promise对象

        async function text() {
          //await 后面可以接 非Promise对象 或者 Promise对象
          let res = await "starry"
          console.log(res) // starry
        }

        text()

接着来看await配合async的神奇大法

        function ajax() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log("ajax-success")
                    resolve("data-starry")
                },1000)
            })
        }

        async function text() {
            //await 后面可以接 非Promise对象 或者 Promise对象
            let res =  await ajax()
            console.log(res) // 等一秒钟打印 data-starry
        }
        text()

在时间过了一秒之后打印ajax-success和data-starry
在这里插入图片描述
await十分深情,他一定要等到一个结果才会往下执行,这样就把异步执行写出了同步的效果。可以说是非常完美了,这里你一定想到了yield,没错async和await就是Generator生成器的语法糖。这里我们去掉await来对比一下

        function ajax() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log("ajax-success")
                    resolve("data-starry")
                },1000)
            })
        }

        async function text() {
            //await 后面可以接 非Promise对象 或者 Promise对象
            let res =  ajax()
            console.log(res) // 等一秒钟打印 data-starry
        }
        text()

在这里插入图片描述
先返回了一个pending状态的Promise对象,过了一秒之后打印了ajax-success。

在实际开发中,async和await用来解决回调地狱,让异步执行看起来像同步一样,下面是一个简单的例子,我们发生ajax1后需要等待ajax1的结果res1,根据res1发生ajax2,最后将res2的数据返回用于渲染页面。

        function ajax1() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve("data1-starry")
                },1000)
            })
        }

        function ajax2() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve("data2-starry")
                },1000)
            })
        }

        async function text() {
            let res1 =  await ajax1()
            console.log(res1) 

            let res2 = await ajax2(res1)
            console.log(res2)

            return res2
        }
        text().then(res => {
            console.log(res,"渲染页面")
        }).catch(err => {
            console.log("err",err)
        })

这里不管是ajax1还是ajax2中只要Promise等待是一个reject的结果,都会马上跳出,执行catch。自然而然还有另外一种写法try,catch写法

        function ajax1() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve("data1-starry")
                }, 1000)
            })
        }

        function ajax2() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve("data2-starry")
                }, 1000)
            })
        }

        async function text() {
            try {
                let res1 = await ajax1()
                console.log(res1)

                let res2 = await ajax2(res1)
                console.log(res2)
                console.log("渲染页面")
            } catch(err) {
                console.log("err",err)
            }
        }
        text()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值