axios外部运作流程大抵如下
axios入口-->axios构造函数-->interceptors申请拦截器-->dispatchRequest办法-->transformRequest申请转换器-->adapter适配器-->transformResponse响应转换器-->interceptors响应拦截器
具体模仿实现axios应用dispatchRequest办法,以及adapter适配器发送一个异步申请的外围代码
//模仿axios发送申请 //1、申明构造函数 function Axios(config){ this.config = config; } //为Axios的原型对象增加request办法,axios(),axios.get()等,外围就是调axios.request()办法 Axios.prototype.request = function(config){ //创立一个promise对象 let promise = Promise.resolve(config); //申明一个数组,保留promise的then办法的两个参数 let chains = [dispatchRequest, undefined]; //undefined作用是占位 //调用then办法,指定回调 let result = promise.then(chains[0],chains[1]); //返回promise的后果 return result; } //2、dispatchRequest函数 function dispatchRequest(config){//该函数的返回后果必须是一个promise对象 //调用适配器发送申请 return xhrAdapter(config).then(response => { //省略对响应后果进行转换解决 return response; },error=>{ throw error; }) } //3、adapter适配器 function xhrAdapter(config){ //该函数的返回值也是promise return new Promise((resolve,reject)=>{ //不思考申请体的发送,创立一个异步申请 let xhr = new XMLHttpRequest(); xhr.open(config.method, config.url); xhr.send(); //绑定事件 xhr.onreadystatechange = function(){ if(xhr.readyState === 4) { if(xhr.status >= 200 && xhr.status < 300) { resolve({ //自定义返回数据 config: config, //配置对象 data: xhr.response, //响应体 headers: xhr.getAllResponseHeaders(), request: xhr,//申请对象 status: xhr.status,//响应状态码 statusText: xhr.statusText //响应状态字符串 }) } else { reject(new Error('申请失败状态码为'+xhr.status)) } } } }) } //测试创立axios函数 let axios = Axios.prototype.request.bind(null) //用axios发送申请 axios({ method:'GET', url:'http://localhost:3000/posts' }).then(res=>{ console.log(res) })