从零开始Vue3数据交互之promise用法详解

 更新时间:2025年02月28日 09:35:12   作者:XError_xiaoyu  
这篇文章主要介绍了Axios的基本使用,包括异步编程的基础知识,如Promise的介绍、特点和基本用法,以及如何使用then、catch和async/await来处理异步操作,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

本篇是在学习Axios时结合自己的笔记与记录,在学习Axios之前首先需要学习promise语法以及需要了解的知识,只有学习了这些,使用axios才会用起来很顺手,并且能够更加深入的理解和使用

1. 预先须知-普通函数和回调函数

1.1 普通函数:

正常调用的函数,一般函数执行完毕后才会继续执行下一行代码

代码示例:

//普通函数
        function fun1(){
            console.log("fun1 invoked")
        }
        console.log("code1 invoked")
        //函数的调用

        fun1()  //执行完函数才会执行下面代码
        console.log("code2 invoked")

如图所示, 在执行完普通函数里面的代码后,才会继续执行后面的代码

1.2 回调函数:

一些特殊的函数,表示未来才会执行的一些功能,后续代码不会等待该函数执行完毕就开始执行了

 代码示例:

function fun1(){
            setTimeout(function (){
                console.log("fun1 invoked") 
            }, 2000);
        }
       
        console.log("code1 invoked")
        fun1()
        console.log("code2 invoked")

如图所示并执行代码时没有等函数执行完后,再执行,而是执行完后,fun1()才执行的 

2. Promise 简介

2.1 简介

前端中的异步编程技术,类似Java中的多线程+线程结果回调!

  • Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。

  • 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

2.2 特点 

Promise对象有以下两个特点,记住下面的几种状态就可以了。

(1)Promise对象代表一个异步操作,<strong>有三种状态:`Pending`(进行中)、`Resolved`(已完成,又称 Fulfilled)和`Rejected`(已失败)。</strong>只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是`Promise`这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
​
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从`<strong>Pending</strong>`变为`<strong>Resolved</strong>`和从`<strong>Pending</strong>`变为`<strong>Rejected</strong>`。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。

3. Promise 基本用法

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

3.1 Promise then

  • resolve 函数: 在promise的回调函数中如果调用resolve方法,promise会由pending转换为resolved状态
  • reject 函数: 在promise的回调函数中如果调用reject方法,promise会由pending转换为reject状态

在下面的图示中都可以看出,回调函数的特点,不会等待函数执行完才继续执行后面的代码 

1. 没有传参

3.1.1 没有调用resolve 函数和reject 函数时

代码示例 

 // 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
        })
 console.log("other code1")
promise.then(
            //等待promise对象状态发生改变实才会执行的代码
            // function(){
            //     //promsie对象状态转换为resolved状态时才会执行的函数
            //     console.log("promise success")
            // }
            function(value){
                //promsie对象状态转换为resolved状态时才会执行的函数
                console.log("promise success:" + value)
            },
            // function(){
            //     //promsie对象状态转换为reject状态时才会执行的函数
            //     console.log("promise fail")
            // }
            function(value){
                //promsie对象状态转换为reject状态时才会执行的函数
                console.log("promise fail:"+ value)
            }
        )
        console.log("other code2")

此时还有没有改变状态,可以看到此时还是按照代码的顺序来执行的,此时是没有执行then中的代码的

3.1.2 调用resolve()函数

// 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
             resolve()
        })
 console.log("other code1")

如果没有传参的话可以先把then函数中的function中的value去掉 

3.1.3 调用 reject()函数

// 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
              reject()
        })
 console.log("other code1")

2. 传参调用函数

3.1.4 调用resolve("good")函数,并传入参数good

// 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
             resolve("good")
        })
 console.log("other code1")

3.1.5 调用reject("no")函数,并传入参数no

// 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
             reject("no")
        })
 console.log("other code1")

3.出现异常情况

3.1.6 人为构造异常

这里通过构建异常情况,并传递错误信息参数

// 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
              // 人为构建一个异常
            throw new Error("error message")
        })
 console.log("other code1")

3.2 Promise catch()

Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。

 代码示例:

这里操作其实和上面的是一致的,需要什么状态时就改为对应的函数调用

 // 创建一个promise对象
        let promise = new Promise(
            function (resolve,reject){
             // 这里代码
             console.log("function invoked")
              // 1. 普通调用函数
                //调用resolve函数
                //  resolve()
                //调用reject函数
                //  reject()
            // 2. 传参调用函数
            resolve("good")
            // reject("no")

            // //人为构建一个异常
            //throw new Error("error message")
        })
 console.log("other code1")
console.log("other code1")
        // 继续调用
        promise.then(
            //等待promise对象状态发生改变实才会执行的代码
            // function(){
            //     //promsie对象状态转换为resolved状态时才会执行的函数
            //     console.log("promise success")
            // }
            function(value){
                //promsie对象状态转换为resolved状态时才会执行的函数
                console.log("promise success:" + value)
            },
        ).catch(
            // 用catch处理时可以把then中第二个function省略
            function(value){
                //当promise状态是reject或者 promsie出现异常时 会执行的函数
                console.log("promise catch:"+ value)
            }
        )
        console.log("other code2")

3.3 async和await的使用

async和await是ES6中用于处理异步操作的新特性。通常,异步操作会涉及到Promise对象,而async/await则是在Promise基础上提供了更加直观和易于使用的语法。

1. async

 帮助我们使用简洁的语法获得一个promise对象

async 用于标识函数的(声明为一个回调函数)下面是它的一些特点:

  async 帮助我们使用简洁的语法获得一个promise对象
                let promise = new Promise((){})
                async function aaa(){}
                1. async 用于标识函数的,async函数返回的结果就是一个promise对象
                2. 方法如果正常return结果promise状态就还是resolved return后的结果就是成功状态的返回值
                3. 方法中出现了异常,则返回的promise就是一个失败状态
                4.  async函数返回的结果如果是一个promise,则状态由内部的promise来决定

 下面是两种声明的方式:

       //通过async直接声明一个回调函数
       async function aaa(){

      }

       //通过箭头函数声明回调函数
        let aaa = async() =>{
            
       }

代码示例:

基本上还是跟之前写的查不多,promise在不同状态时就会调用对应的方法

async function fun1(){
        // return 888
        // throw new Error("something wrong")
        //快速创建一个resolve对象并返回
        // let promise = Promise.resolve("nice")
        //快速创建一个reject对象并返回
        let promise = Promise.reject("no")
        return promise
    }
    //调用fun1函数返回promise对象
    let promise= fun1()
    //调用promise对象的then和catch方法
    promise.then(
        function(value){
            //promsie对象状态转换为resolved状态时才会执行的函数
            console.log("success:" + value)
        }
    ).catch(
        function(value){
             //当promise状态是reject或者 promsie出现异常时 会执行的函数
            console.log("fail:" + value)
        }
    )

2. await

帮助我们成功获得promise成功状态的返回值的关键字

await的一些特点:

await 帮助我们成功获得promise成功状态的返回值的关键字
                1. await 右边如果是一个普通值,则直接返回该值,如果右边是promise,返回promise成功状态的结果 let res = await "张三" res 就是张三,那么用await干嘛
                   let res await "张三"
                   let res = await Promise.resolve("张三")
                       此时res = "张三"
                2. await 右边如果是一个失败状态的promise 那么await会直接抛出异常
                3. await 关键字必须在async修饰的函数中使用,async函数中可以没有await关键字
                4. await 在存在await方法的内部后边的代码会等待await执行完毕后继续执行

代码示例:

        还是跟据不用的的状态来执行不同的函数,这里不同的是await可以当做返回成功状态的关键词,因此不需要创建promise对象来调用了,而是直接使用await

   async function fun1(){
        return 888
    }
    async function fun2(){
        try{
                let res = await fun1()
                // let res = await Promise.reject("something wrong")
                console.log("await got:" + res)
        }catch(e){
            console.log("catch got:" + e)
        }
       
    }
    fun2()
async function fun1(){
        return 888
    }
    async function fun2(){
        try{
                // let res = await fun1()
                let res = await Promise.reject("something wrong")
                console.log("await got:" + res)
        }catch(e){
            console.log("catch got:" + e)
        }
       
    }
    fun2()

如图所示:

总结

到此这篇关于Vue3数据交互之promise用法详解的文章就介绍到这了,更多相关Vue3数据交互promise详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue封装的可编辑表格插件方法

    Vue封装的可编辑表格插件方法

    今天小编就为大家分享一篇Vue封装的可编辑表格插件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Vue3 基础概念与环境搭建过程详解

    Vue3 基础概念与环境搭建过程详解

    本文介绍了Vue3的基础概念,包括响应式系统、组合式API和更好的TypeScript支持,同时,文章手把手教你如何搭建Vue3开发环境,使用Vite创建项目,并解析了项目的结构,通过这些内容,读者可以快速上手Vue3,并为后续的学习打下坚实的基础,感兴趣的朋友一起看看吧
    2025-02-02
  • vue中el-tree动态初始默认选中和全选实现方法

    vue中el-tree动态初始默认选中和全选实现方法

    这篇文章主要给大家介绍了关于vue中el-tree动态初始默认选中和全选实现的相关资料,eltree默认选中eltree是一种常用的树形控件,通常用于在网页上呈现树形结构的数据,例如文件夹、目录、组织结构等,需要的朋友可以参考下
    2023-09-09
  • Vue3数据更新,页面没有同步更新的问题及解决

    Vue3数据更新,页面没有同步更新的问题及解决

    这篇文章主要介绍了Vue3数据更新,页面没有同步更新的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue中格式化时间过滤器代码实例

    vue中格式化时间过滤器代码实例

    这篇文章主要介绍了vue格式化时间过滤器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue根据值给予不同class的实例

    vue根据值给予不同class的实例

    今天小编就为大家分享一篇vue根据值给予不同class的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue3的7种种组件通信详情

    Vue3的7种种组件通信详情

    Vue3兼容大部分Vue2的特性,用Vue2代码开发Vue3都可以,性能上面打包大小减少 41%,初次渲染快 55%,更新快 133%,内存使用减少 54%,本篇文章主要介绍Vue3的7种种组件通信,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Vue实现图片预览效果实例(放大、缩小、拖拽)

    Vue实现图片预览效果实例(放大、缩小、拖拽)

    现在项目中有这样的一个需求,对上传的图片可以点击之后在线预览,这篇文章主要给大家介绍了关于Vue实现图片预览效果实例(放大、缩小、拖拽)的相关资料,需要的朋友可以参考下
    2021-05-05
  • Vue中添加手机验证码组件功能操作方法

    Vue中添加手机验证码组件功能操作方法

    组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。这篇文章主要介绍了VUE 中添加手机验证码组件,需要的朋友可以参考下
    2017-12-12
  • vue-video-player视频播放器使用配置详解

    vue-video-player视频播放器使用配置详解

    这篇文章主要为大家详细介绍了vue-video-player视频播放器的使用和配置,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论