《用得上的前端知识》系列 - 你我都很忙,能用100字说清楚,绝不写万字长文
实现原理
axios 的使用
axios 的使用方法 - 1
let CancelToken = axios.CancelToken;
let cancel;
axios.get('/data', {
params: {xxx},
cancelToken : new CancelToken(c=>{
cancel = c;
})
});
cancel(); //取消请求
axios 的使用方法 - 2
let CancelToken = axios.CancelToken;
let source = CancelToken.source(); //source ==> {token, cancel}
axios.get('/data', {
params: {xxx},
cancelToken : source.token //token 是一个 promise 对象
});
source.cancel('Some reason'); //取消请求
CancelToken 方法的实现
// 只展示核心代码,以便于了解整体结构
function CancelToken( excutor ){
const promiseResolve;
this.promise = new Promise(resolve=>{
promiseResolve = resolve;
});
const cancel = ()=>{
promiseResolve();
}
excutor( cancel );
}
CancelToken.source 的实现
CancelToken.source = ()=>{
let cancel;
let token = new CancelToken(c=>{
cancel = c;
});
return {
token,
cancel
}
}
取消请求的实现
// 取消请求的实现(只展示核心代码)
let xhr = new XMLHttpRequest();
xhr.open(...);
if( config.cancelToken ){
config.cancelToken.promise.then(()=>{
xhr.abord();
xhr = null;
});
}
原理总结
- 首先,创建一个 promise 对象,通过配置参数 cancelToken 传给 axios对象;
- 同时将 promise 的 resolve 方法暴露出来,用于执行 promise;
- 在 axios 内部,发送完 xhr 请求后,通过 promise.then 方法执行 xhr.abort() 终止请求;
- 当在外部调用 resolve 方法时,xhr.abort() 就会被执行,请求就被取消了。