请问cancel的问题
import axios from 'axios';
import {SUCC_CODE, TIMEOUT} from './config';
const CancelToken = axios.CancelToken;
let cancel;
// 获取内容数据--ajax
export const getCategoryContent = (id) => {
cancel && cancel('取消了前一次的请求!');
console.log(cancel)
cancel = null;
console.log(cancel)
return axios.get(`http://www.imooc.com/api/category/content/${id}`, {
timeout: TIMEOUT,
cancelToken: new CancelToken(function executor(c) {
cancel = c;
})
}).then(res => {
if (res.data.code === SUCC_CODE) {
console.log('ok');
return res.data.content;
}
throw new Error('没有成功获取到数据!');
}).catch(err => {
if (axios.isCancel(err)) { // 取消前一次的请求
console.log(err);
} else {
// handle error
console.log(err);
}
})
};
第一次发送ajax请求,第10行的打印为undefined,第12行打印为null。然后第一次ajax请求完成后,在点击发送第二次ajax请求,第10行打印的是一个函数。请问老师,然后根据cancel && cancel('取消了前一次的请求!'); 第二次发送ajax请求时也是执行cancel了吧,但是第二次还是能正常返回了数据,实际上第二次没有执行cancel。请问cancel应该是取消状态为pending的请求吗?
然后是cancel=null的问题,请问这是有什么用。麻烦老师了
正在回答
你好,1、第一次发送请求的时候,是因为定义的cancel没有赋值,所以第10行输出的是undefined。然后又进行了 cancel = null;所以12输出了null;
2、然后接着往下执行,如下图,这里cancel进行了赋值。被赋值cancel,是c这个方法
3、然后第二次请求的时候,执行了cancel && cancel('取消了前一次的请求!');这个是判断cancel 是否为真(即是否存在),存在的话,进行了调用,取消了前一次的请求!(因为取消的是前一次请求,所以)
4、然后因为在(2)的时候,cancel被赋值了,所以再次执行到第10行的时候,输出的是个函数。
5、接着 cancel = null;执行了重新赋值为null。因为如果不是快速连续请求几次的话,是不需要取消了前一次请求的!所以这里赋值为null,这样便于判断下次请求的时候,是不是连续点击的请求,来决定是否需要取消了前一次的请求!
若能帮助到你,望采纳。
祝学习愉快!
- 参与学习 人
- 提交作业 209 份
- 解答问题 3299 个
本路径是通过ES6基础知识、运用Zepto、Swiper、fullPag等移动端常用工具包、以及当下流行框架Vue,结合多个实战案例,还原真实开发场景,最终实现手机端购物商城网页开发。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星