当前位置: 首页 > Web前端 > JavaScript

axios如何取消请求

时间:2023-03-27 11:17:36 JavaScript

接口分析https://github.com/axios/axio...用法1constCancelToken=axios.CancelToken;constsource=CancelToken.source();axios.post('/user/12345',{name:'newname'},{cancelToken:source.token}).catch(function(thrown){if(axios.isCancel(thrown)){console.log('Requestcanceled',thrown.message);}else{//处理错误}});source.cancel('操作被用户取消。');用法2constCancelToken=axios.CancelToken;letcancel;axios.get('/user/12345',{cancelToken:newCancelToken(functionexecutor(c){cancel=c;})});取消();就是加上cancelToken参数,值可以是对象,有可以取消的操作。源码分析参考用例,找到axios.CancelToken,找到源码https://github.com/axios/axio...isCancel.js判断是否取消对象module.exports=functionisCancel(value){return!!(value&&value.__CANCEL__);};Cancel.js构造一个取消对象,用于标识取消函数的消息信息Cancel(message){this.message=message;}Cancel.prototype.toString=functiontoString(){return'Cancel'+(this.message?':'+this.message:'');};Cancel.prototype.__CANCEL__=true;module.exports=Cancel;CancelToken。jsvarCancel=require('./Cancel');functionCancelToken(executor){//executor必须是一个函数if(typeofexecutor!=='function'){thrownewTypeError('executormustbeafunction.');}varresolvePromise;//创建一个promise并记录resolve方法,以便使用this.promise=newPromise(functionpromiseExecutor(resolve){resolvePromise=resolve;});var令牌=这个;//cancel的核心方法:用reason记录取消的原因,用来判断是否已经取消。并解析上面的promiseexecutor(functioncancel(message){if(token.reason){//Cancellationhasalreadybeenrequestedreturn;}token.reason=newCancel(message);resolvePromise(token.reason);});}//判断是否已经取消,如果是则抛出取消原因CancelToken.prototype.throwIfRequested=functionthrowIfRequested(){if(this.reason){throwthis.reason;}};//静态方法,返回一个例子//使用第二种方法的实质是下面的实现CancelToken.source=functionsource(){varcancel;vartoken=newCancelToken(functionexecutor(c){cancel=c;});return{token:token,cancel:cancel};};module.exports=CancelToken;搜索代码cancelToken,找到ib/core/dispatchRequest.jsfunctionthrowIfCancellationRequested(config){if(config.cancelToken){config.cancelToken.throwIfRequested();}}跟踪throwIfCancellationRequested调用处,点击函数throwIfCancellationRequested,按F12,查看调用处。也就是说在初始化的时候会调用,请求成功的时候会调用,请求失败的时候会判断请求是否已经发起。如果已经发起,则抛出取消原因。.解决了用户调用取消的时机。在请求发起之前,请求被拦截。请求发起后,无论结果如何,都不会进入处理逻辑。向上追查,由promisify的xhr/http代码显示,在发起请求前,判断是否传递了cancelToken。如果传入,则添加cancelToken的promise回调取消请求。注意CancelToken.js,暴露了cancel方法,promise会在用户调用cancel方法后resolve。重组xhr/http,在发起请求前判断是否有cancelToken,传入回调给promise拦截请求的发起。所以CancelToken.js需要有一个promise,通知xhr/http用户是否执行了取消。dispatchRequest.js,在初始化、请求成功、请求失败时判断是否被取消,如果是则抛出错误。所以需要一个CancelToken.js的变量来判断是否已经取消,需要一个throwIfRequested方法来判断。调用取消时,用户可能想做一些自定义操作。所以executor可以由用户传入,也可以提供一个静态方法创建一个新的实例,executor已经写好了。值得学习的是,我们经常按照标准方法调用promise,在promisebody中执行resolve,rejectnewPromsie((resolve,reject)=>{...if(...){resolve('xxx')}else{reject('yyy')}})其实可以更灵活,用变量保存resolve/reject,在外面执行,提高灵活性。letresolver;newPromsie((resolve,reject)=>{...resolver=resolve;})...resolver('xxx')...函数的参数是一个函数,所以我们要明白为什么用户可以直接调用,直接用t表示CancelToken.js写好的executor){return;}token.reason=newCancel(message);resolvePromise(token.reason);});...}CancelToken.source=functionsource(){varcancel;//执行器函数定义vartoken=newCancelToken(functionexecutor(c){cancel=c;});返回{令牌:令牌,取消:取消};};simplifyvarcancel;//函数定义functionexecutor(c){cancel=c;}//函数调用execotr(()=>{console.log('abc'})也就是说,定义一个函数时,一个全局变量用来保存局部变量的信息,就是引用用户传入的信息,因为有变量引用,我觉得Executor也是一个闭包,在设计子函数的时候,展开为属性。

最新推荐
猜你喜欢