文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-01-28 09:00

关注

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯