ajax怎么实现,类似axios的拦截器呢?有什么思路吗??

新手上路,请多包涵

ajax请求拦截

阅读 2.1k
2 个回答

promise 封装一层即可

按照axios的源码
原理:

const promise = Promise.resolve(config)

return promise.then(request, request).then(request, request).then(ajax).then(response, response)

封装:

function Axios(){
    this.request = []
    this.response = []
    this.interceptors = {
        request: (fulfilled, rejected) => {
            this.request.push({fulfilled, rejected})
        },
        response: (fulfilled, rejected) => {
            this.response.push({fulfilled, rejected})
        }
    }
}
Axios.prototype.request = function (dispatchRequest, config){
    var chain = [dispatchRequest, undefined];
    var promise = Promise.resolve(config);

    this.request.forEach(function (interceptor) {
        chain.unshift(interceptor.fulfilled, interceptor.rejected);
    });

    this.response.forEach(function (interceptor) {
        chain.push(interceptor.fulfilled, interceptor.rejected);
    });

    while (chain.length) {
        promise = promise.then(chain.shift(), chain.shift());
    }

    return promise;
}

调用:

const axios = new Axios()

axios.interceptors.request((config)=>{}, (err) => {})
axios.interceptors.response((config)=>{}, (err) => {})
axios.request((config)=> new Promise((resolve, reject) => {ajax(config)}), config)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题