axios的混合模式是怎么实现的?也就是 axios 既可以当函数调用,也可以当对象使用,比如axios({})、axios.get
本身axios就是个函数,对象调用是因为在axios的原型上挂载了这些方法 2020.1.16更新
axios定义了一个类,类里面里面有request(config)
、get
、post
、options
等方法,我们使用的axios其实就是这个类实例里面的request
方法,然后将类里面的其余方法都挂到这个实例上,也就是实现了混合模式
class Axios {
request(config) {}
get(url,config){}
post(url,data,condif){}
// ... head options delete put patch
}
function createInstance() {
const context = new Axios()
const instance = Axios.prototype.request.bind(context)
extend(instance, context)
return instance
}
axios调用过程
- 调用axios.request方法,该方法为bind返回的包裹函数,用于将request内部的this绑定到新建的Axios对象上
- 如果有请求拦截器调用拦截器
- 调用dispatchRequest
- 执行适配器adapter
- 调用dispatchXhrRequest,也