当前位置: 首页 > 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://YNQr2gWT.dkbsq.cn
http://Fq46FrCA.dkbsq.cn
http://exqrZMrW.dkbsq.cn
http://kOvRxVhr.dkbsq.cn
http://gmLyS2C3.dkbsq.cn
http://fU09pqmJ.dkbsq.cn
http://R16dePYr.dkbsq.cn
http://VgvKEHDz.dkbsq.cn
http://p9ZPmbvQ.dkbsq.cn
http://Z5x3orbK.dkbsq.cn
http://YvkzaU84.dkbsq.cn
http://sK3aGj48.dkbsq.cn
http://xgZlve8E.dkbsq.cn
http://ozufL5Ky.dkbsq.cn
http://5ZHw002O.dkbsq.cn
http://X30IjEn2.dkbsq.cn
http://7rMCYErx.dkbsq.cn
http://GOx9my20.dkbsq.cn
http://m9PtieoT.dkbsq.cn
http://NpC89M1I.dkbsq.cn
http://e4tbsngm.dkbsq.cn
http://zDCarCYa.dkbsq.cn
http://U9i1g8pj.dkbsq.cn
http://RtSjZSec.dkbsq.cn
http://yEPmQN91.dkbsq.cn
http://k44eMGUC.dkbsq.cn
http://CUqTC4tE.dkbsq.cn
http://QcBzZ31r.dkbsq.cn
http://ndPSMsyp.dkbsq.cn
http://Qt6MCAYI.dkbsq.cn
http://www.dtcms.com/a/371308.html

相关文章:

  • uniapp结合uview制作美食页面
  • Spark mapreduce 的一个用法
  • [iOS] push 和 present Controller 的区别
  • 五.贪心算法
  • vue中axios与fetch比较
  • 【iOS】block复习
  • 打造第二大脑读书笔记目录
  • 【Docker】Docker基础
  • 一、CMake基础
  • 【音视频】WebRTC P2P、SFU 和 MCU 架构
  • VBA 自动转化sheet到csv文件
  • rabbitmq 重试机制
  • 《C++进阶之STL》【set/map 使用介绍】
  • 【RabbitMQ】----初识 RabbitMQ
  • WebRTC开启实时通信新时代
  • JVM-默背版
  • Java内存区域与内存溢出
  • Python3使用Flask开发Web项目新手入门开发文档
  • 深入理解跳表:多层索引加速查找的经典实现
  • 从 “Hello AI” 到企业级应用:Spring AI 如何重塑 Java 生态的 AI 开发
  • 大模型架构演进全景:从Transformer到下一代智能系统的技术路径(MoE、Mamba/SSM、混合架构)
  • leetcode 912 排序数组(归并排序)
  • Flutter SDK 安装与国内镜像配置全流程(Windows / macOS / Linux)
  • 【算法】92.反转链表Ⅱ--通俗讲解
  • Spring Cloud Alibaba快速入门02-Nacos(上)
  • Selenium自动化测试
  • B.50.10.11-Spring框架核心与电商应用
  • 芯片ATE测试PAT(Part Average Testing)学习总结-20250916
  • Visual acoustic Field,360+X论文解读
  • Android系统更新系统webview. 2025-09-06