Vue Axios异步与数据类型转换问题浅析

 更新时间:2023年01月28日 08:40:06   作者:知奕奕  
总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路,Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架,主要作用就是实现AJAX异步通信

axios 请求中异步与否问题

众所周知,axios 请求有些请求需要配合异步函数来实现,我大概总结了两种适配场景:

不使用异步:后端响应值对后续操作无影响,我们仅需要判断这个请求是否成功的情况下

使用异步:我们需要存储后端响应值并使用它进行某些渲染操作

不使用异步的例子

参考我们上一节的最后一块,我们抽离了登录校验的 axios 请求,这是具体代码

可见,我们只需要把本地 token 传递给后端,经过后端 jwt 验证并返回一个成功状态码 200,既然成功了,自然就会执行 then 内的方法,此时我们无需对响应体做出任何判断都可以明确的知道此次登录验证是成功的,所以直接返回一个布尔值 true 即可

这里就不需要使用到异步函数

validateLogin: (url, uname, pwd) => {
    // 使用post请求,请求体data即传入两个必要值
    http
      .post(url, {
        username: uname,
        password: pwd,
      })
      // 在then中处理请求成功的方法
      .then((res) => {
        console.log(res);
        let token = res.data.msg;
        localStorage.setItem("token", token);
        fastMessage.success("成功登录!");
      })
      // 在catch中处理请求失败的方法
      .catch((err) => {
        fastMessage.error("用户名或密码错误!");
        return false;
      });
    // 返回值有无取决于你的项目需求
    return true;
  },

使用异步的例子

一般的,在我们使用 axios 请求后端服务器时必定会有一小段往返时间,假设我们不使用异步函数,那么就会造成还没有取回响应体就直接返回了,那么必然会得到一个空值!

使用 try...catch... 代码块处理响应成功与否,因为 catch 能捕获到任意层次深度的任意错误,故 axios 请求一旦失败则必被捕获!

异步执行请求保证了我们获取的响应体值为后端数据,最后的 return 也能正确的返回带值变量

import http from "./http.js";
let userDatas;
// 异步函数,发送后端查询数据库得到所有用户信息
async function userDataQuery(url) {
  try {
    // 异步请求后端并拿到结构Promise
    let res = await http.get(url);
    // 将获取到的响应体中的值赋予给全局变量
    userDatas = res.data.data;
    console.log(userDatas);
  } catch (err) {
    console.log("这TMD是错的");
  }
  // 返回全局变量
  return userDatas;
}
export default {
  userDataQuery,
};

同志醒醒,这还没完,因为我们使用 async 构造异步函数,无论该函数返回啥,结果都是一个 promise 对象,我们只需要最后一步,对其进行数据提取并存储就完事了!!!

请看模块的 script 部分代码:

这里使用了 pinia 进行数据存储,setUsersList 是 actions 中的一个方法,它是用来设置 state 中的其中一个变量的值的,这一步操作下来即可把我们要的数据存储到 store 里面了!

因为变量 datas 已被 reactive 响应式,故 store 的更新也会带动该变量的更新,同时带动对应渲染的更新

import { onMounted, reactive, ref } from "vue";
import apiQuery from "../../api/api-query.js";
import dbStore from "../../store/db-store.js";
const store = dbStore();
let datas = reactive(store.$state.userLists);
// 执行最后一步的promise处理
apiQuery.userDataQuery("/sdb/allusers").then((res) => {
  // 调用store中的方法直接把数据存储到status域中的变量
  store.setUsersList(res);
  // 随意输出一些内容作为验证
  console.log(res);
});

对象与数组转换

执行异步 axios 请求时,对于 POST 类型的数据存储往往会遇到 formdata 是一个对象,而我们 vue 渲染时需要的偏偏就得是数组类型的

这一步可以在 store 中的 actions 配置的方法里面进行处理

此处简单的使用了 foreach 把对象内容一一压入数组的方式实现,请注意每次执行该方法是变量值的配置!!!

import { defineStore } from "pinia";
import Names from "./names.js";
const dbStore = defineStore(Names.DBSTORE, {
  // 随意配置一个数组变量userLists
  state: () => {
    return {
      userLists: [],
    };
  },
  actions: {
    // 设置变量的值,形参data即传来的对象object
    setUsersList(data) {
      // 转换前务必清空变量值,否则会造成值重复添加现象
      this.userLists = [];
      // foreach将对象中的值一个个取出来添加到数组里面
      for (let i in data) {
        console.log(data[i]);
        this.userLists.push(data[i]);
      }
    },
  },
  getters: {},
});
export default dbStore;

到此这篇关于Vue Axios异步与数据类型转换问题浅析的文章就介绍到这了,更多相关Vue Axios异步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vant-List-@load事件一直触发的解决

    vant-List-@load事件一直触发的解决

    这篇文章主要介绍了vant-List-@load事件一直触发的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 详解vue2如何实现点击预览本地文件

    详解vue2如何实现点击预览本地文件

    这篇文章主要为大家详细介绍了vue2如何实现点击预览本地的word、excle、pdf文件,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • vue实现文章内容过长点击阅读全文功能的实例

    vue实现文章内容过长点击阅读全文功能的实例

    下面小编就为大家分享一篇vue实现文章内容过长点击阅读全文功能的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Vue强制组件重新渲染的方法讨论

    Vue强制组件重新渲染的方法讨论

    这篇文章给大家详细介绍了Vue强制组件重新渲染的正确方法,非常的实用,有需要的小伙伴可以参考下
    2020-02-02
  • Vue实现点击后文字变色切换方法

    Vue实现点击后文字变色切换方法

    下面小编就为大家分享一篇Vue实现点击后文字变色切换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • vue+openlayers绘制省市边界线

    vue+openlayers绘制省市边界线

    这篇文章主要为大家详细介绍了vue+openlayers绘制省市边界线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Vue如何在CSS中使用data定义的数据浅析

    Vue如何在CSS中使用data定义的数据浅析

    这篇文章主要给大家介绍了关于Vue如何在CSS中使用data定义的数据的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下
    2022-05-05
  • vue实现广告栏上下滚动效果

    vue实现广告栏上下滚动效果

    这篇文章主要介绍了vue实现广告栏上下滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 图文详解vue中proto文件的函数调用

    图文详解vue中proto文件的函数调用

    这篇文章主要给大家介绍了vue中proto文件函数调用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • 详解windows下vue-cli及webpack 构建网站(三)使用组件

    详解windows下vue-cli及webpack 构建网站(三)使用组件

    本篇文章主要介绍了详解windows下vue-cli及webpack 构建网站(三)使用组件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论