请问cancel的问题

请问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回答

你好,1、第一次发送请求的时候,是因为定义的cancel没有赋值,所以第10行输出的是undefined。然后又进行了 cancel = null;所以12输出了null;

2、然后接着往下执行,如下图,这里cancel进行了赋值。被赋值cancel,是c这个方法

http://img1.sycdn.imooc.com//climg/5bc8529b000188df04860102.jpg

3、然后第二次请求的时候,执行了cancel && cancel('取消了前一次的请求!');这个是判断cancel 是否为真(即是否存在),存在的话,进行了调用,取消了前一次的请求!(因为取消的是前一次请求,所以)

4、然后因为在(2)的时候,cancel被赋值了,所以再次执行到第10行的时候,输出的是个函数。

5、接着 cancel = null;执行了重新赋值为null。因为如果不是快速连续请求几次的话,是不需要取消了前一次请求的!所以这里赋值为null,这样便于判断下次请求的时候,是不是连续点击的请求,来决定是否需要取消了前一次的请求!

若能帮助到你,望采纳。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
热门框架Vue开发WebApp 18版
  • 参与学习           人
  • 提交作业       209    份
  • 解答问题       3299    个

本路径是通过ES6基础知识、运用Zepto、Swiper、fullPag等移动端常用工具包、以及当下流行框架Vue,结合多个实战案例,还原真实开发场景,最终实现手机端购物商城网页开发。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师