当前位置: 首页 > news >正文

axios的两种异步方式对比

这两种方式本质上都是异步的,都是基于 Promise 的机制,但它们在语法风格、可读性、错误处理、控制流方面有一些关键区别。下面我来帮你全面对比:

语法结构对比

方式写法特点
.then().catch()axios.get(...).then(...).catch(...)链式调用,适合简单逻辑
async/awaitawait axios.get(...)更接近同步语法,适合复杂流程

示例对比

方式一:.then().catch()(链式调用)

axios.get('/api/data').then(res => {console.log(res.data);}).catch(err => {console.error(err);});
  • 优点:语法简洁,适合快速调用。

  • 缺点:嵌套多层 .then() 时容易变得混乱(回调地狱)。

方式二:async/await(同步风格)

async function fetchData() {try {const res = await axios.get('/api/data');console.log(res.data);} catch (err) {console.error(err);}
}
  • 优点:逻辑清晰,异常处理统一,适合复杂流程。

  • 缺点:必须在 async 函数中使用,略微多一层结构。

错误处理对比

场景.then().catch()async/await
单个请求失败.catch() 捕获try/catch 捕获
多个请求嵌套多个 .catch()一个 try/catch 统一处理
异步函数中抛错不易追踪更易定位错误位置

控制流对比(多个请求)

.then() 写法:

axios.get('/api/user').then(user => {return axios.get(`/api/posts?user=${user.id}`);}).then(posts => {console.log(posts.data);}).catch(err => console.error(err));

async/await 写法:

async function getUserPosts() {try {const user = await axios.get('/api/user');const posts = await axios.get(`/api/posts?user=${user.data.id}`);console.log(posts.data);} catch (err) {console.error(err);}
}

async/await 更像同步代码,逻辑更清晰,调试更容易。

总结建议

使用场景推荐方式
简单请求.then().catch()
多步异步流程async/await
错误处理统一async/await
可读性优先async/await
快速测试或临时调用.then()

如果你正在开发 Vue 项目中的 API 模块,我建议你封装所有请求为 async 函数,这样在组件中调用时更清晰、更易维护。

企业级 API 请求模块示例

基于 axios,支持以下功能:

  • ✅ 自动注入 Token(如 JWT)

  • ✅ 全局错误处理(如 401、500)

  • ✅ 请求/响应拦截器

  • ✅ Loading 状态支持

  • ✅ 自动重试机制(可选)

  • ✅ 支持异步 async/await 调用

项目结构建议

src/
├── api/
│   ├── axios.js         # axios 实例配置
│   ├── request.js       # 封装请求方法
│   └── modules/
│       └── user.js      # 用户相关接口

1.axios.js — 创建 axios 实例

// src/api/axios.js
import axios from 'axios';const instance = axios.create({baseURL: '/api', // 可根据环境配置timeout: 10000,headers: {'Content-Type': 'application/json'}
});// 请求拦截器
instance.interceptors.request.use(config => {const token = localStorage.getItem('access_token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;
}, error => Promise.reject(error));// 响应拦截器
instance.interceptors.response.use(response => {return response.data;
}, error => {const { response } = error;if (response) {if (response.status === 401) {console.warn('未授权,请重新登录');// 可跳转登录页或清除 token} else if (response.status >= 500) {console.error('服务器错误');}} else {console.error('网络异常');}return Promise.reject(error);
});export default instance;

2.request.js — 封装请求方法

// src/api/request.js
import axios from './axios';export const get = (url, params = {}) => {return axios.get(url, { params });
};export const post = (url, data = {}) => {return axios.post(url, data);
};export const put = (url, data = {}) => {return axios.put(url, data);
};export const del = (url, params = {}) => {return axios.delete(url, { params });
};

3. modules/user.js — 用户接口模块

// src/api/modules/user.js
import { get, post } from '../request';export const login = data => post('/login', data);
export const getUserInfo = () => get('/user/info');
export const logout = () => post('/logout');

4. Vue 中调用示例

import { login, getUserInfo } from '@/api/modules/user';async function handleLogin(formData) {try {const res = await login(formData);localStorage.setItem('access_token', res.access_token);console.log('登录成功:', res.user);} catch (err) {console.error('登录失败:', err);}
}

可选增强功能

功能实现方式
自动刷新 Token拦截器中检测 401,调用 refresh 接口
Loading 状态在请求前后触发全局 loading(如 Vuex 或 Pinia)
请求重试使用 axios-retry 插件或自定义逻辑
多环境配置使用 .env 文件设置 baseURL
http://www.xdnf.cn/news/1486225.html

相关文章:

  • K8S-Pod(下)
  • 笔记本、平板如何成为电脑拓展屏?向日葵16成为副屏功能一键实现
  • python---静态方法和类方法
  • Python学习——安装配置python环境+入门
  • Onecode 可视化动作揭秘系列二:组件类型个性化配置技术协议
  • 嵌入式解谜日志之数据结构—基本概念
  • 插入排序与希尔排序
  • Python3使用Flask开发Web项目新手入门开发文档
  • JavaEE 进阶第三期:开启前端入门之旅(三)
  • 数据结构——排序
  • 内网后渗透攻击--linux系统(权限维持)
  • MySQL 8.0+ 内核剖析:架构、事务与数据管理
  • thinkphp和vue基于Workerman搭建Websocket服务实现用户实时聊天,完整前后端源码demo及数据表sql
  • 20250907_梳理异地备份每日自动巡检py脚本逻辑流程+安装Python+PyCharm+配置自动运行
  • 什么叫进件?在第三方支付行业里,这是一个非常专业的词汇。
  • Linux驱动开发(1)环境与代码框架
  • Linux —— 虚拟进程地址空间
  • Java-Spring入门指南(三)深入剖析IoC容器与Bean核心机制
  • 基于 Django+Vue3 的 AI 海报生成平台开发博客(海报模块专项)
  • HTTPS协议——对于HTTP的协议的加密
  • 架构进阶——解读121页IT规划咨询项目规划报告【附全文阅读】
  • HarmonyOS 应用开发深度解析:掌握 ArkTS 声明式 UI 与现代化状态管理
  • 大数据(非结构化数据,Spark,MongoDB)
  • 《沈南鹏传 - 做最擅长的事》(下篇)读书笔记
  • Gitlab 配置自定义 clone 地址
  • 【面试向】边缘计算基础介绍
  • Java全栈开发面试实录:从基础到高阶技术深度解析
  • Oracle到金仓数据库信创改造迁移实施规划方案(下篇)
  • 【mysql】SQL自连接:什么时候需要,什么时候不需要?
  • 【C++】类与对象(下)