axios为什么还要promise封装一次

axios返回的就是一个promise对象 为什么有很多人还是会promise再封装一次呢?
例如:

export function get (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {params: data})
      .then(response => {
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })
}
阅读 14k
8 个回答

我对你问题理解的重点是封装:不需要封装axios,拿来直接用即可。
所以我的答案:每个项目有很多接口,需要写很多重复的东西,比如接口的验签,接口信息错误拦截统一处理等等
是一定要封装的

但如果你想问的是为什么要promise@eson_li的回答就很好了

下面是我的封装,注释的地方就是封装的理由,抛砖引玉,大佬多批评

const Axios = function (obj, loading = true, toast = true) {
    // 查看接口请求到响应完成时间
    console.time(obj.url) 
    // 请求接口时的loading效果
    if (loading) {
        this.$Indicator.open()
        loading = false
    }
    let headers = {}
    // 签名
    if (!/^https:\/\/|http:\/\//.test(obj.url)) {
        const token = util.cookies.get("token");
        let timestamp = obj.timestamp || parseInt(+new Date() / 1000);
        headers = {
            "timestamp": timestamp,
            "signature": sign(obj.data || {}, timestamp),
            "token": token
        }
    }
    return new Promise((response, reject) => {
        // 默认post,
        let method = obj.method || "post";
        service({
                url: obj.url,
                method: method,
                data: obj.data || {},
                headers: headers
            })
            .then(({ data }) => {
                this.$Indicator.close()
                console.timeEnd(obj.url)
                // 与后端定义:code为0表示接口按预期返回
                if (data.code !== 0 && toast) {
                    this.$Toast(data.message);
                    console.error(data)
                }
                // code等于3表示token失效需要重新登陆
                if (data.code === 3) {
                    util.project.login()
                    response(data);
                    return
                }
                response(data);
            })
            .catch(rej => {
                this.$Indicator.close()
                reject(rej);
            });
    });
};

可以增加js引擎gc负担,为将来向甲方要钱预留优化空间
还增加了冗余代码,可以减少代码可读性增加维护难度,让公司轻易不敢炒自己鱿鱼

借用别人的回答:因为axios的响应信息里面不止包含了response body ,还包含了其他信息。但是我们大多数情况下只关心 response body的内容。

我的理解:是否对axios进行封装,这是根据公司业务需求而定的。大多数都会进行二次封装,增加项目的可维护性;统一标准,代码标准化。

1、我觉得这种写法根本就是多余的,根本没了解axios的用法,不管你要怎么样接收或者发送数据都可以通过拦截器处理

axios拦截器使用

2、对于公司业务根本不可能这么封装,完全会在外面再写个类,和promise没有关系,本身axios就是一个promise,本身就符合标准

我不会的时候也是这么瞎写的

新手上路,请多包涵

那是为了方便你在后面调用接口后,对结果进行处理

其实不是对axios的封装,而是对下面几方面的处理

  1. 对请求域名的统一管理-baseUrl,因为你一个项目至少有dev,test,pre,pro4个环境,也就是4个域名(有些公司都是一个域名,然后通过host来解决)
  2. 对请求参数的处理,比如get请求, 参数值为null, undefined,空字符串的可以统一过滤掉
  3. 对请求头的统一处理,比如把token带到请求头,参数验签等
  4. 对请求响应的处理,比如只有code===200才是正常业务数据,resolve(data),其他情况直接toast提示错误信息,然后reject(data), 因为业务代码里面一定会出现需要特殊code来下一步处理的情况

总结
对axios的二次封装就是把所有请求公共部分写在一个文件里面,业务代码里面的请求只需要关心请求路径,返回的业务数据即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏