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异步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue项目中全局引入1个.scss文件的问题解决

    vue项目中全局引入1个.scss文件的问题解决

    这篇文章主要跟大家介绍了vue项目中全局引入1个.scss文件的问题解决,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • vue3+vite+vant4手机端项目实战记录

    vue3+vite+vant4手机端项目实战记录

    这篇文章主要给大家介绍了关于vue3+vite+vant4手机端项目实战的相关资料,Vue3是一种前端开发框架,它的目标是提供更好的性能和开发体验,需要的朋友可以参考下
    2023-08-08
  • 基于vue-cli搭建多模块且各模块独立打包的项目

    基于vue-cli搭建多模块且各模块独立打包的项目

    这篇文章主要介绍了基于vue-cli搭建多模块且各模块独立打包的项目,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 如何区分vue中的v-show 与 v-if

    如何区分vue中的v-show 与 v-if

    这篇文章主要介绍了如何区分vue中的v-show 与 v-if ,帮助大家更好的理解和学习vue框架,感兴趣的朋友可以了解下
    2020-09-09
  • vue基于better-scroll实现左右联动滑动页面

    vue基于better-scroll实现左右联动滑动页面

    这篇文章主要介绍了vue基于better-scroll实现左右联动滑动页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Vue中key的原理以及diff算法详解

    Vue中key的原理以及diff算法详解

    这篇文章主要介绍了Vue中key的原理以及diff算法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Vue监听一个数组id是否与另一个数组id相同的方法

    Vue监听一个数组id是否与另一个数组id相同的方法

    今天小编就为大家分享一篇Vue监听一个数组id是否与另一个数组id相同的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 如何使用JS监听一个变量改变

    如何使用JS监听一个变量改变

    在JS编程中如果能监测变量的内容,当变量值发生变化时,实时发出通知,这定是一项很有用的功能,下面这篇文章主要给大家介绍了关于如何使用JS监听一个变量改变的相关资料,需要的朋友可以参考下
    2023-05-05
  • 如何基于Vue制作一个猜拳小游戏

    如何基于Vue制作一个猜拳小游戏

    Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式,下面这篇文章主要给大家介绍了关于如何基于Vue制作一个猜拳小游戏的相关资料,需要的朋友可以参考下
    2023-01-01
  • vue 文件目录结构详解

    vue 文件目录结构详解

    本篇文章主要介绍了vue 文件目录结构详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论