JavaScript封装Promise之如何返回【error,res】类型的数据总结【有一个坑】【以Axios为例】

本文详细解析了如何在使用axios发送HTTP请求时正确处理Promise。重点介绍了在请求成功与失败时,如何通过resolve方法返回数据或错误,避免使用reject方法。同时,对axios错误处理的两种情况进行了区分说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一定要注意:Promise如果你要处理异常【等价于catch】就使用reject方法,而如果仅是返回数据,必须使用resole方法 

const axios = require("axios");
const GlobalError = require("../global/GlobalError.js");

module.exports = class OwnAxios {
    static async axiosRequest (url, formData = null, method = "POST", successFunc = null, failFunc = null) {
        console.log("formdata", formData);
        let [error, res] = await new Promise((resolve, reject) => {
            axios({
                url: url,
                method: method,
                data: formData,
            }).then((res) => {
                resolve([null, res]);
            }).catch((error) => {
                封装Promise这里不能使用reject(error)【等价于catch】,要返回error结果必须resolve才可以
                【非常重要】axios这个库的的错误有两种情况【1、请求成功,但是状态码不是200; 2、是请求失败】
                if (error.response) {
                    请求已发出,返回状态码不是200的情况【这种情况依然需要判断状态码,把结果赋值返回给res】
                    resolve([null, error.response]);
                } else {
                    这种情况就是数据库连接失败,请求异常了【结果返回给error】
                    resolve([error, null]);
                }
            });
        });
        console.log([error, res]);
        return GlobalError.requestErrorOrSuccessHandle(res, error, successFunc, failFunc);
    }
};


 

<think>我们参考上述引用内容,特别是引用[2]和引用[3]中的示,来封装一个具有自定义配置和拦截器的Axios封装步骤: 1. 创建Axios,以便可以拥有自定义配置,而不影响全局Axios。 2. 添加请求拦截器:在请求发送之前对配置进行处理,如添加统一的请求头、认证信息等。 3. 添加响应拦截器:在接收到响应之后,对响应数据进行处理,如直接返回响应数据中的data,或者统一处理错误。 以下是一个封装,我们将创建一个request.js文件,在其中封装Axios。 注意:根据引用[2]和引用[3]的示,我们将使用axios.create()方法创建实,然后使用interceptors属性来添加拦截器。 我们假设基础URL为'http://api.example.com',并设置超时时间。同时,在请求拦截器中,我们添加一个Authorization头(如果需要的话),在响应拦截器中,我们直接返回response.data(这样在请求时就不需要再写.data了),并处理错误。 具体代码如下:</think>### 如何封装 Axios 请求库(实现自定义配置和拦截器) 封装 Axios 主要分为三个核心步骤,以下是详细实现方案: --- #### **1. 创建 Axios(自定义配置)** ```javascript // utils/request.js import axios from 'axios' // 创建独立实(避免污染全局axios) const request = axios.create({ baseURL: 'https://api.yourservice.com', // 统一基础路径 timeout: 10000, // 请求超时时间 headers: { 'Content-Type': 'application/json' } // 默认请求头 }) ``` --- #### **2. 添加请求拦截器(前置处理)** ```javascript // 请求拦截器 request.interceptors.request.use( (config) => { // 1. 添加认证信息(如Token) const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` // 2. 特殊数据处理(如序列化表单) if (config.data instanceof FormData) { config.headers['Content-Type'] = 'multipart/form-data' } return config }, (error) => { // 请求错误处理(如网络异常) return Promise.reject(error) } ) ``` --- #### **3. 添加响应拦截器(后置处理)** ```javascript // 响应拦截器 request.interceptors.response.use( (response) => { // 1. 提取核心数据(根据后端约定调整) const res = response.data // 2. 按状态码处理业务逻辑 if (res.code === 200) { return res.data // 返回实际业务数据 } else { // 处理业务错误(如token过期) if (res.code === 401) { alert('登录已过期,请重新登录') router.push('/login') } return Promise.reject(new Error(res.message || 'Error')) } }, (error) => { // 3. HTTP状态码错误处理 if (error.response) { switch (error.response.status) { case 404: console.error('接口不存在') break case 500: console.error('服务器错误') break } } return Promise.reject(error) } ) ``` --- #### **4. 封装请求方法(简化调用)** ```javascript // 封装GET/POST方法 export const get = (url, params) => request.get(url, { params }) export const post = (url, data) => request.post(url, data) // 示调用 import { get } from '@/utils/request' get('/user/list', { page: 1 }).then(data => { console.log(data) }) ``` --- #### **关键特性说明** | 功能 | 实现方式 | |------------------|----------------------------------| | **统一错误处理** | 响应拦截器集中处理 HTTP/Business 错误 | | **Token自动注入**| 请求拦截器动态读取 localStorage | | **数据解构** | 响应拦截器直接返回业务数据层 | | **多环境支持** | 通过 baseURL 区分开发/生产环境 | > 封装建议:在大型项目中,可将拦截器拆分为独立模块(如 `auth-interceptor.js`、`error-interceptor.js`)实现关注点分离[^3][^4]。 --- ### 相关问题 1. **如何实现 Axios 的请求重试机制?** (可在响应拦截器中添加计数器实现自动重试) 2. **如何统一处理 Axios 的取消请求?** (使用 CancelToken 或 AbortController 实现请求中断) 3. **在 Vue/React 中如何全局注册封装后的 Axios?** (可通过插件机制或 Context API 注入) 4. **如何为不同接口设置不同的超时时间?** (在请求拦截器中根据 URL 动态覆盖 timeout 配置) [^1]: 请求拦截器用于在发送请求前统一处理配置 [^2]: 响应拦截器负责解构数据层和统一错误处理 [^3]: 独立实避免全局配置污染 [^4]: 模块化拦截器提升可维护性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值