美文网首页
async await

async await

作者: 小吉头 | 来源:发表于2020-10-16 14:07 被阅读0次

    在Promise基础中,使用async await可以从语法层面去掉回调,async和await该怎么使用

    基本概念

    • async + 函数
      async 函数的返回值是promise对象,promise对象的结果由函数的执行结果决定
    • await + 表达式
      1、表达式一般是promise对象,也可以是其他值
      2、如果表达式是promise对象,await 表达式返回的是promise成功的值。如果是其他表达式,await 表达式返回表达式本身的结果。

    async 举个例子

        <script>
            async function fn1(){
                return 1
            }
            const result = fn1()
            result.then(
                value => {
                    console.log('成功的回调,值为:',value)
                },
                reason => {
                    console.log('失败的回调,值为:',reason)
                }
            )
        </script>
    

    async function fn1()async 函数的返回值是promise对象,promise对象的结果由函数的执行结果return 1决定,这里promise对象的结果是成功
    async 函数语法可以理解为在用promise做了层封装再返回,上面的代码可以写成这样,更加方便理解:

            async function fn1(){
                return Promise.resolve(1)
            }
    

    这里立刻返回一个状态为成功的promise对象,也可以延迟返回:

            async function fn1(){
                return new Promise((resolve,reject) => {
                    setTimeout(() => {
                        resolve(1)
                    },3000)
                })
            }
    

    上面三种方式promise对象的结果都是成功,也可以设置为失败:

            async function fn1(){
                throw 2
            }
    
            async function fn1(){
                return Promise.reject(2)
            }
    
                return new Promise((resolve,reject) => {
                    setTimeout(() => {
                        reject(2)
                    },3000)
                })
    

    await 举个例子

    • 表达式返回一个promise对象
        <script>
            function fn1(){
                return new Promise((resolve,reject) => {
                    setTimeout(() => {
                        resolve(1)
                    },3000)
                })
            }
    
            async function fn2(){
                const value = await fn1()
                console.log('成功的值',value)
            }
    
            fn2()
        </script>
    

    await 等待fn1()返回的promise对象的结果变为成功,直接获取到成功的值。
    这样就不需要用promise对象.then()再设置成功回调去取值了。
    await必须写在async函数内,await只能获取成功的结果
    如果fn1返回一个失败的promise该怎么处理?

        <script>
            function fn1(){
                return new Promise((resolve,reject) => {
                    setTimeout(() => {
                        reject(1)
                    },3000)
                })
            }
    
            async function fn2(){
                try{
                    const value = await fn1()
                    console.log('成功的值',value)
                }catch(error){
                    console.log('失败的值',error)
                }
            }
    
            fn2()
        </script>
    >>>失败的值 1
    

    再看一个返回promise对象的例子:

        <script>
            async function fn1(){
                return 1
            }
    
            async function fn2(){
                try{
                    const value = await fn1()
                    console.log('成功的值',value)
                }catch(error){
                    console.log('失败的值',error)
                }
            }
    
            fn2()
        </script>
    
    >>>成功的值 1
    

    这里输出1,不是因为fn1()中return 1,而是因为fn1()使用async修饰,返回一个promise对象,这个promise对象成功的结果是fn1()的执行结果,即1

    • 普通表达式
      如果是普通表达式,得到表达式本身的结果
      await必须写在async函数内,async函数内不一定有await
        <script>
            async function fn1(){
                return 1
            }
    
            async function fn2(){
                const value = await fn1()
                console.log('得到的值:',value)
            }
            fn2()
        </script>
    
    >>>得到的值 1
    

    相关文章

      网友评论

          本文标题:async await

          本文链接:https://www.haomeiwen.com/subject/cbqzpktx.html