美文网首页
6-3、扩展axios.create静态接口

6-3、扩展axios.create静态接口

作者: Eileen_1d88 | 来源:发表于2019-12-11 15:42 被阅读0次
需求

目前为止,我们的axios都是一个单例,一旦我们修改了axios的默认配置,会影响所有的请求。我们希望提供一个axios.create的静态接口,允许我们创建一个新的axios实例,同时允许我们传入新的配置和默认配置合并,并作为新的默认配置。
举个例子:

const instance = axios.create({
  transformRequest: [(function(data) {
    return qs.stringify(data)
  }), ...(axios.defaults.transformRequest as AxiosTransformer[])],
  transformResponse: [...(axios.defaults.transformResponse as AxiosTransformer[]), function(data) {
    if (typeof data === 'object') {
      data.b = 2
    }
    return data
  }]
})

instance({
  url: '/config/post',
  method: 'post',
  data: {
    a: 1
  }
})
静态方法扩展

由于axios扩展了一个静态接口,所以我们先来修改接口类型的定义
types/index.ts

interface AxiosStatic extends AxiosInstance {
  create(config?: AxiosRequestConfig): AxiosInstance
}

create函数可以接受一个AxiosRequestConfig类型的配置,作为默认配置的扩展,也可以不传参。

接着我们来实现axios.create静态方法
axios.ts

import { AxiosInstance, AxiosRequestConfig, AxiosStatic } from "./types";
import Axios from './core/Axios'
import { extend } from "./helpers/util";
import defaults from './core/defaults'
import mergeConfig from "./core/mergeConfig";

function createInstance(config: AxiosRequestConfig): AxiosStatic {
  const context = new Axios(config)
  const instance = Axios.prototype.request.bind(context)
  extend(instance, context)
  return instance as AxiosStatic
}
const axios = createInstance(defaults)
axios.create = function create(config) {
  return createInstance(mergeConfig(defaults, config))
}
export default axios
demo
import axios from '../../src/index'
import qs from 'qs'
axios({
  transformRequest: [(function(data) {
    return qs.stringify(data)
  }), ...(axios.defaults.transformRequest as AxiosTransformer[])],
  transformResponse: [...(axios.defaults.transformResponse as AxiosTransformer[]), function(data) {
    if (typeof data === 'object') {
      data.b = 2
    }
    return data
  }],
  url: '/api/extend/post',
  method: 'post',
  data: {
    a: 1
  }
}).then((res) => {
  console.log(res.data)
})

const instance = axios.create({
  transformRequest: [(function(data) {
    return qs.stringify(data)
  }), ...(axios.defaults.transformRequest as AxiosTransformer[])],
  transformResponse: [...(axios.defaults.transformResponse as AxiosTransformer[]), function(data) {
    if (typeof data === 'object') {
      data.b = 2
    }
    return data
  }]
})
instance.defaults.headers.common['test2'] = 'test2'

instance({
  url: '/api/extend/post',
  method: 'post',
  data: {
    a: 8
  }
}).then((res) => {
  console.log(res.data)
})

这样,我们就实现了axios.create静态接口的扩展,整个ts-axios的配置化也告一段落。官方axios还支持取消请求的能力,在发送请求前及发送请求出去未响应之前都可以取消请求。接下来我们来实现取消请求的功能。

相关文章

  • 扩展axios.create静态接口

    扩展axios.create静态接口

  • 6-3、扩展axios.create静态接口

    需求 目前为止,我们的axios都是一个单例,一旦我们修改了axios的默认配置,会影响所有的请求。我们希望提供一...

  • vue 请求配置

    vue项目配置请求接口 const Axios = axios.create({ baseURL: proces...

  • Java中3种代理总结

    1、JDK静态代理 业务接口 接口的实现类 代理类,实现接口,并扩展实现类的功能 2、JDK动态代理 业务接口 实...

  • JDK静态代理示例代码

    JDK静态代理示例代码 业务接口 接口的实现类 代理类,实现接口,并扩展实现类的功能 1、业务接口 2、业务实现类...

  • ThinkPHP5.1门面(Facade)

    门面(Facade)门面为容器中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展...

  • Kotlin 基础知识(下)

    1,接口 2,Kotlin 可以对一个类的属性和方法进行扩展,是一种静态行为,对被扩展的类代码本身不会造成任何影响...

  • JQuery写拓展

    基础 $.extend()扩展JQuery静态方法,$.fn.extend()扩展JQuery实例方法静态方法: ...

  • dubbo源码阅读之adative-code-templet

    package <扩展点接口所在包>; public class <扩展点接口名>$Adpative implem...

  • 2019-06-09 jave核心代码看书笔记(六)接口、lam

    一,接口 1.接口中的静态方法:javaSE 8 中,允许在接口中增加静态的方法,目前为止,静态方法都是放在伴随类...

网友评论

      本文标题:6-3、扩展axios.create静态接口

      本文链接:https://www.haomeiwen.com/subject/vpgogctx.html