vue 使用 async 和 await 实现异步 axios 同步化(实战案例:数据异步校验通过后,再执行保存)

简介: vue 使用 async 和 await 实现异步 axios 同步化(实战案例:数据异步校验通过后,再执行保存)

必备知识点

  • axios请求会生成一个Promise实例对象
  • await后面可以直接跟一个Promise实例对象,返回值不是Promise对象,而是Promise对象处理之后的结果(await后面跟一个axios请求时,返回值即请求的响应结果 res)
  • 若await 后的表达式的值不是一个 Promise,则该值将被转换为一个已正常处理的 Promise
  • await 只能在使用async定义的函数中使用
  • async函数都会隐式返回一个promise,要获取Promise的返回值应该用then方法
async function timeout(){
    return "helloworld";
}
timeout().then((result)=>{
    console.log(result);
});
console.log("我在异步函数后面,会先执行谁呢");
 
// 我在异步函数后面,会先执行谁呢
// helloworld

await 在 .then 中使用

// 内部有 await 的箭头函数前要用 async 
***.then( async (res)=>{
   let a = await this.$http(***)
});

await 在 forEach 中使用

// 内部有 await 的箭头函数前要用 async 
list.forEach( async (item)=>{
   let a = await this.$http(item.url)
});

async 、await 与Promise对比

1、不再需要多层.then方法

假设一个业务分很多步骤完成,并且每个步骤都是异步,依赖上一个步骤的结果。

function takeLongTime(n) {
    return new Promise(resolve => {
        setTimeout(() => resolve(n + 200), n);
    });
}
 
function step1(n) {
    console.log(`step1 with ${n}`);
    return takeLongTime(n);
}
 
function step2(n) {
    console.log(`step2 with ${n}`);
    return takeLongTime(n);
}
 
function step3(n) {
    console.log(`step3 with ${n}`);
    return takeLongTime(n);
}
 
// Promise方式
function doIt() {
    console.time("doIt");
    const time1 = 300;
    step1(time1)
        .then(time2 => step2(time2))
        .then(time3 => step3(time3))
        .then(result => {
            console.log(`result is ${result}`);
            console.timeEnd("doIt");
        });
}
 
doIt();
 
// async await方式
async function doIt() {
    console.time("doIt");
    const time1 = 300;
    const time2 = await step1(time1);
    const time3 = await step2(time2);
    const result = await step3(time3);
    console.log(`result is ${result}`);
    console.timeEnd("doIt");
}
doIt();

2、可以对Promise进行并行处理

案例需求描述

执行保存用户信息的操作,对新录入的用户信息进行校验,若数据库中存在相同name的用户,则提示修改;若不存在相同name的用户,则可以保存


代码实现

  methods: {
    async ifvalid() {
      // 校验:数据库中是否存在name为张三的用户;
      let res = await this.$http.get("/user/ifexist?name=张三");
      if (res.data) {
        return true;
      } else {
        return false;
      }
    },
    async save() {
      if (await this.ifvalid()) {
        alert("校验通过,可以保存啦!");
      } else {
        alert("校验未通过,请修改后重试!");
      }
    }
  }

目录
相关文章
|
1月前
|
JavaScript 前端开发
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
这篇文章主要讨论了axios的使用、原理以及源码分析。 文章中首先回顾了axios的基本用法,包括发送请求、请求拦截器和响应拦截器的使用,以及如何取消请求。接着,作者实现了一个简易版的axios,包括构造函数、请求方法、拦截器的实现等。最后,文章对axios的源码进行了分析,包括目录结构、核心文件axios.js的内容,以及axios实例化过程中的配置合并、拦截器的使用等。
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
|
1月前
|
JavaScript 前端开发
【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?
文章讨论了Vue项目目录结构的设计原则和实践,强调了项目结构清晰的重要性,提出了包括语义一致性、单一入口/出口、就近原则、公共文件的绝对路径引用等原则,并展示了单页面和多页面Vue项目的目录结构示例。
|
12天前
|
JavaScript 前端开发 开发者
vue中使用axios请求post接口,请求会发送两次
vue中使用axios请求post接口,请求会发送两次
|
1月前
|
JSON JavaScript 前端开发
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
这篇文章讨论了在Vue项目中封装axios的最佳实践,包括设置接口请求前缀、请求头、状态码、请求方法的封装,以及如何使用请求和响应拦截器来处理token和响应状态,从而简化HTTP请求的配置和错误处理,提高代码的可维护性。
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
|
4月前
|
JavaScript
vue封装axios(用interceptors封装)
vue封装axios(用interceptors封装)
48 0
|
4月前
|
JSON 前端开发 JavaScript
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
367 0
|
1月前
|
JavaScript 前端开发
vue引入axios出现Module parse failed: Unexpected token (5:2)
vue引入axios出现Module parse failed: Unexpected token (5:2) 页面显示 Cannot GET /
|
2月前
|
JSON JavaScript 前端开发
Vue中的axios深度探索:从基础安装到高级功能应用的全面指南
在Vue项目中,高效的前后端通信是构建丰富用户体验的关键。axios作为前端与后端沟通的桥梁,其重要性不言而喻。本文将带您领略axios的魅力,从基本概念、安装方法,到高级应用技巧,助您快速掌握在Vue中利用axios进行HTTP请求的精髓。我们不仅会探讨axios的基础用法,如GET、POST请求,还将深入探索跨域配置、全局注册以及设置拦截器等高级功能,助您轻松实现优雅的前后端通信。
|
3月前
|
JavaScript
vue对axios封装
vue对axios封装
|
3月前
|
存储 JSON 自然语言处理
SSMP整合案例交互之在idea中利用vue和axios发送异步请求进行前后端调用
SSMP整合案例交互之在idea中利用vue和axios发送异步请求进行前后端调用
31 2