You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functioncreateInstance(defaultConfig){varcontext=newAxios(defaultConfig);varinstance=bind(Axios.prototype.request,context);// Copy axios.prototype to instanceutils.extend(instance,Axios.prototype,context);// Copy context to instanceutils.extend(instance,context);returninstance;}// Create the default instance to be exportedvaraxios=createInstance(defaults);// Expose Axios class to allow class inheritanceaxios.Axios=Axios;// Factory for creating new instancesaxios.create=functioncreate(instanceConfig){returncreateInstance(mergeConfig(axios.defaults,instanceConfig));};
项目主要技术栈是Vue,所以我们在请求后端接口的时候一般会用到axios的组件,那么我们就来分析一下它的源码及它的实现。
axios主要目录结构
由使用到探索
我们一般使用的时候都会先new一个axios实例出来,那么这个实例是怎么来的呢?里边都有什么呢?我们来看一下源代码最外层一个axios.js文件
通过源代码我们可以看到axios导出的axios对象中有一个create方法,还有个Axios对象,同时axios本身还是createInstance函数,并且他们都会传递一个参数进去,所以我们在使用axios的时候会有多种不同的调用方法,他们最终实例化的其实是core文件下的Axios.js中所写的Axios构造函数。
上边是部分源代码,我们可以看到在这个构造函数中他会有个default对象,是用来存放我们的配置信息的,还有个interceptors对象,里边包了两个实例,分别对应了request拦截器和response拦截器。并且在Axios的原型链上有写了一个request方法,并对支持的请求方法都赋值了一个别名。
我们的配置config是如何生效的
我们看源代码会发现几乎每个方法都会有一个config参数,我们使用的时候的config就是通过这种方式贯穿整个axios的。我们来看一下我们使用的3种方式:
对比我们刚才所说的axios实例的生成,我们可以看到这三种方式其实都会把config用过参数的形式传递进去,并且在每一步调用的时候生效。
请求拦截器和响应拦截器
我们在上边看axios的构造函数的时候看到他绑定了一个request拦截器和response拦截器,那么他们是做什么的呢?又是如何生效的呢?顾名思义,拦截器就是拦截请求的,可以在发送request之前或者接收response之前进行拦截,然后做一些事情达到我们的目的。
dispatchrequest做了什么事情
我们再看拦截器生效的时候发现在
Axios.prototype.request
中会有这么一段代码var chain = [dispatchRequest, undefined];
,并且会在promise = promise.then(chain.shift(), chain.shift());
被调用,那么这个dispatchrequest是什么呢?通过源码分析,我们可以看到dispatchrequest主要做了3件事情:
拿到config对象,对config进行传给http请求适配器前的最后处理;
http请求适配器根据config配置,发起请求 ;
http请求适配器请求完成后,如果成功则根据header、data、和config.transformResponse拿到数据,
转换后的response,并return。
段落小结
通过上面对axios源码结构分析,我们可以得到axios搭建的一个主要结构:
axios如何基于promise搭建异步桥梁
了解了axios的主要结构及调用顺序,那我们来看一下axios是如何通过promise来搭建异步的桥梁?
我们那get方法来举例,当我们调用axios的get方法的时候实际上是调用axios原型链上的get方法,而其原型链上的get方法又指向了其原型链上的request方法。
我们可以看到在request方法里边有个chain数组,这个其实是相当于一个方法的队列,这里会把request的拦截器插入chain数组的前边,response拦截器插入chain数组后边,通过下边的while循环,两两调用promise.then来顺序执行请求拦截器到dispatchrequest再到响应拦截器的方法。
在dispatchrequest中呢又会调用封装好的ajax(xhrAdapter方法),
xhrAdapter
方法返回的是还一个Promise对象xhrAdapter
内的XHR发送请求成功后会执行这个Promise对象的resolve
方法,并将请求的数据传出去,反之则执行
reject
方法,并将错误信息作为参数传出去。The text was updated successfully, but these errors were encountered: