Promise 结合 axios 实现异步请求的使用方法

前端 潘老师 19小时前 10 ℃ (0) 扫码查看

Promise 和 axios 作为 JavaScript 中强大的工具,它们的结合使用能让异步请求的处理变得更加高效和便捷。今天,咱们就深入探讨一下 Promise 结合 axios 的使用方法。

一、Promise基础回顾

在开始讲解二者结合的使用技巧前,先简单回顾一下 Promise。Promise 有三种状态,分别是 pendding(进行中)、fullfilled(已成功)、reject(已失败) 。一个 Promise 对象的内部有 [[PromiseState]][[PromiseResult]] 两个重要属性,[[PromiseState]] 表示当前 Promise 的状态,[[PromiseResult]] 则存储着最终的结果值,例如 [[PromiseState]]: "fulfilled"[[PromiseResult]]: 23,这表明该 Promise 已成功,并且返回结果是 23。

二、Promise 与 axios 结合使用场景及方法

在实际开发中,我们经常需要使用 axios 来调用接口获取数据。在这个过程中,合理地结合 Promise 可以更好地处理异步操作的结果。下面介绍两种常见的使用方式。

(一)直接返回 axios 并处理结果

当我们需要获取 axios 调用接口后的返回值时,具体该怎么做呢?代码示例如下:

async adjBalFn(schemaGuid) {
    // 定义请求参数
    let params = {
        agencyCode: this.agencyCode,
        balanceKey: [],
        fisPerd: this.date.includes('0')? Number(this.date.split('0')[1]) : Number(this.date),
        schemaGuid
    };
    // 显示加载状态
    this.$showLoading();
    // 这里返回一个axios请求,axios本身返回的是一个Promise对象
    return this.$axios
      .post('/XXXX/api', params)
      .then(result => {
            // 判断接口返回的状态
            if (result.data.flag ==='success') {
                // 隐藏加载状态
                this.$hideLoading();
                // 将接口返回的数据再返回出去,供后续使用
                return result.data.data;
                // return Promise.resolve(111);  这里如果使用这行代码,会直接返回固定值111,而不是接口数据
            } else {
                // 隐藏加载状态
                this.$hideLoading();
                // 提示错误信息
                this.$message.error(result.data.msg);
            }
        })
      .catch(error => {
            // 捕获错误,提示错误信息并隐藏加载状态
            this.$message.error(error);
            this.$hideLoading();
        });
}

在使用这个函数时,可以像下面这样:

// 调用函数并等待其执行完成,获取返回值
let res = await this.adjBalFn(adjBalList[i].schemaGuid);
// 判断返回值是否为空对象,如果为空则提示相应信息
if (Object.keys(res).length === 0) {
    this.$message.error('当前期间余额调节表还未生成,请确认生成后进行归档!');
    adjBalFlag = false;
    break;
}

这里的 return this.$axios 返回的是一个 Promise,而 result.data.data 就是这个 Promise 最终成功时返回的值。通过这种方式,我们可以很方便地获取到接口返回的数据,并进行后续处理。

(二)外层包裹 new Promise 处理返回值

除了上述方法,还有一种方式是在最外层返回 new Promise,然后在内部进行 resolve 操作。代码如下:

async adjBalFn(schemaGuid) {
    // 定义请求参数
    let params = {
        agencyCode: this.agencyCode,
        balanceKey: [],
        fisPerd: this.date.includes('0')? Number(this.date.split('0')[1]) : Number(this.date),
        schemaGuid
    };
    // 显示加载状态
    this.$showLoading();
    // 这里返回一个新的Promise
    return new Promise(resolve => {
        this.$axios
          .post('/gl/bank/getRecon', params)
          .then(result => {
                // 判断接口返回状态
                if (result.data.flag ==='success') {
                    // 隐藏加载状态
                    this.$hideLoading();
                    // 将接口返回的数据通过resolve传递出去
                    resolve(result.data.data);
                } else {
                    // 隐藏加载状态
                    this.$hideLoading();
                    // 提示错误信息
                    this.$message.error(result.data.msg);
                }
            })
          .catch(error => {
                // 捕获错误,提示错误信息并隐藏加载状态
                this.$message.error(error);
                this.$hideLoading();
            });
    });
}

在使用这个函数时,需要通过 .then 来接收返回值:

this.adjBalFn(adjBalList[i].schemaGuid).then(res => {
    // 输出返回值
    console.log('res: ', res);
    // 判断返回值是否为空对象,如果为空则提示相应信息
    if (Object.keys(res).length === 0) {
        this.$message.error('当前期间余额调节表还未生成,请确认生成后进行归档!');
        adjBalFlag = false;
        break;
    } 
});

这种方式下,最外层包裹的 new Promise 就像是一个大容器,把整个异步操作封装起来。通过 resolve 传递出去的值,就是这个函数最终返回的值,在 .then 中可以直接使用这个返回值进行后续逻辑处理。

掌握了 Promise 和 axios 的这些结合使用方法,在前端开发中处理异步接口请求时,就能更加方便。希望本文能对大家有所帮助,在实际项目开发中可以多尝试运用这些技巧。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/front/18080.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】