场景:

  分页: 每次点击分页会发送请求,如果上一次请求还未获取到,下一次请求已经开始且先一步获取到,那么数据上会出现问题。

  快速点击会发送多次请求,多次点击的时候一般的做法我们会定义一个flag,此时也可以采用取消请求的方法。

解决办法:

  方法一:每次提交新请求时都断开之前的请求,保证同一时间等待的仅仅是一个请求

  方法二:如果是列表请求,可以在请求开始的时候给个遮罩层+loading效果,这样只有等数据出来了,遮罩层消失,用户才可以进行操作。

(1)取消ajax请求

$.ajax、$.get、$.post都有同一个返回值,可以使用对象接收,当请求未返回且想结束这次请求时,只需要针对对象使用abort()方法即可。

var req;
if(req !=null) req.abort();
req = $.ajax({ ... });

eg:

定义一个变量xhr:null

在方法中:

(2)取消axios请求

1、get请求

在全局定义CancelToken:

var CancelToken = axios.CancelToken
var cancel

在请求接口传入cancelToken:

在需要终止的地方调用cancel(此处是watch里面监听的changePage,即切换页码的时候):

2、post请求

定义cancelObj存放每一个CancelToken.source(),保证每一个都是独一无二。

var CancelToen = axios.CancelToken
var cancelObj = []

因为posDataByUrl是个封装,我们只需对想要调用的url处理,那么可以过滤掉其他的(indexOf ),data.page是页码,可以根据它来达到存储不同的cancelToken:

axio_conf是配置,所以最终的目的是让cancelToken放在配置中:

调用:同样是在监听页码改变的时候终止上一次的请求,然后开始这一次的请求:

'use strict';
// axiosUrl存储所有接口地址
var axiosUrl = {
caseBlackList: '/sp/v1/cases',
//新案例详情接口(审核详情用到)
getCasesDetail: '/sp/case/case-detail/',
......
};
var CancelToken = axios.CancelToken;
var cancelObj = [];
var axiosCommon = {
axio_conf:{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
timeout: 100000
},
upload_type: 1,
reject: function (resolve, err, type,callback) {
console.log(resolve, err, type)
callback && callback()
},
// 获取cookie
getCookie (keyword) {
const reg = new RegExp('(^| )' + keyword + '=([^;]*)(;|$)')
const arr = document.cookie.match(reg)
let result = null
if (arr) {
result = unescape(arr[2])
}
return result;
},
// setCookie
setCookie (name, value, expires, path, domain, secure) {
document.cookie = name + '=' + escape(value) +
((expires) ? '; expires=' + expires : '') +
((path) ? '; path=' + path : '') +
((domain) ? '; domain=' + domain : '') +
((secure) ? '; secure' : '')
}, // deleteCookie
deleteCookie (name, domain, path) {
this.getCookie(name, (message) => {
if (message.result !== null) {
document.cookie = name + '=' + message.result +
((path) ? '; path=' + path : '') +
((domain) ? '; domain=' + domain : '') +
'; expires=Thu, 01-Jan-70 00:00:01 GMT'
}
})
},
// url参数查询
getQueryString (name) {
let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
let r = window.location.search.substr(1).match(reg)
if (r != null) return decodeURI(r[2])
return null
},
// axios post参数格式化
stringify (data) {
var params = new URLSearchParams();
for (var i in data) {
if (typeof data[i] == 'object') {
params.append(i, JSON.stringify(data[i]));
} else {
params.append(i, data[i]);
}
}
return params;
},
// 加上验证信息and去除缓存
verify (data) {
let self = this
if (data === undefined) data = {};
var authArr = [];
for (var i in data) {
authArr.push(i)
}
if (authArr.indexOf('auth_token')<0){
data.auth_token = new Date().getTime()
data.auth_username = new Date().getTime()
}
data.time = new Date().getTime();
return data;
},
// 按动态url通过post方式请求接口
postDataByUrl (url, data, callback) {
let self = this;
data = self.verify (data);
if (url.indexOf(axiosUrl.postNewCaseList) !== -1) {
cancelObj[Number(data.page)] = {}
cancelObj[Number(data.page)].source = CancelToken.source()
self.axio_conf.cancelToken = cancelObj[Number(data.page)].source.token
}
return new Promise(function (resolve, reject) {
axios.post(url, Qs.stringify(data), self.axio_conf)
.then(function (response) {
if (response.status === 200) {
resolve({
data: response.data,
status: response.status
});
}
})
.catch(function (error) {
if (axios.isCancel(error)) {
// console.log('Request canceled', error.message);
} else {
self.reject(resolve, error, 'post');
}
});
})
},
// 按动态url通过put方式请求接口
putDataByUrl (url, data, callback) {
let self = this;
data = self.verify (data);
return new Promise(function (resolve, reject) {
axios.put(url, Qs.stringify(data), self.axio_conf)
.then(function (response) {
if (response.status === 200) {
resolve({
data: response.data,
status: response.status
});
}
})
.catch(function (error) {
self.reject(resolve, error, 'put');
});
})
},
// 按动态url通过get方式获取数据
getDataByUrl (url, data) {
let self = this;
data = self.verify (data);
return new Promise(function (resolve, reject) {
axios.get(url, {params: data}, self.axio_conf)
.then(function (response) {
if (response.status === 200) {
resolve({
data: response.data,
status: response.status
});
}
})
.catch(function (error) {
self.reject(resolve, error, 'get');
});
})
},
// 获得全部标签
getAllTags (data) {
return this.getDataByUrl(axiosUrl.tags,data)
},
// 案例列表-新
postNewCaseList (username, data) {
return this.postDataByUrl(axiosUrl.postNewCaseList + username, data);
},
.......
}

遇到的问题:

暂未总结好= =

jq和axios的取消请求的更多相关文章

  1. 学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求

    一.axios的基本使用: ✿ 使用axios前必知细节: 1.axios 函数对象(可以作为axios(config)函数使用去发送请求,也可以作为对象调用方法axios.request(confi ...

  2. axios浏览器异步请求方法封装 XMLHttpRequest

    axios学习笔记defaults(浏览器端异步请求处理方式) 浏览器异步请求方法封装,主要使用XMLHttpRequest lib/adapters/xhr.js //入口 var utils = ...

  3. axios 取消请求的方法

    开发中遇到需要取消请求的功能,,点击终止查询可以取消开始查询请求,再次点击开始查询又可以进行查询. 解决方法:axios官方文档上的CancelToken,一开始用了这个api后,可以成功取消请求,但 ...

  4. axios 取消请求

    解决思路 在发送第二次请求的时候如果第一次请求还未返回,则取消第一次请求,以保证后发送的请求返回的数据不会被先发送的请求覆盖. axios官方文档取消请求说明 方法一: const CancelTok ...

  5. 使用Typescript重构axios(十八)——请求取消功能:总体思路

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. 使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  8. 使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. axios 如何取消已发送的请求?

    前言 最近在项目中遇到一个问题,在连续发送同一请求时,如果第二次请求比第一次请求快,那么实际显示的是第一次请求的数据,这就会造成数据和我选择的内容不一致的问题.解决的方案:在后续发送请求时,判断之前的 ...

随机推荐

  1. ubuntu 系统网络突然"网络已禁用"

    sudo service network-manager stop  sudo rm /var/lib/NetworkManager/NetworkManager.state  sudo servic ...

  2. 当点击onBackpress方法或者onKeyDown方法时出现不能响应的问题解决办法

    一般来讲,当我们点击手机上的back键之后,会直接调用activity的onbackpress()方法,或者我们也可以通过这样来进行捕捉点击事件 @Override public boolean on ...

  3. js使用正则表达式从url中获取参数值

    //从url中获取参数值 function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^ ...

  4. c++ 开放随笔

    1.设计或使用类时 一定先弄清流程 了解对象直接的关系(这个必须清楚) 如多对多,一对多,一对一关系.不然弄list map set时相对麻烦. 2.map 中key是不能重复的,可以看成一个主键,定 ...

  5. .Net中的序列化和反序列化详解

    序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中.反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程. 然而为什么需要序列化和反序列化这样的机制 ...

  6. Unity在协程内部停止协程自身后代码执行问题

    当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: us ...

  7. GOlang eclipse install

    http://golang.org/dl/ 下载golang https://codeload.github.com/GoClipse/goclipse/tar.gz/v0.8.1 解压 安装ecli ...

  8. 再不学会这些技巧,你就OUT了!

    俗话说的好:技多不压身!这句话真是一点都没错,尤其是在21世纪的今天,作为老师的你,如果不会使用下面所要说的这款神器,恐怕你就像玩游戏一样,要被get out!那到底是什么呢?它就是现在正在全国初高中 ...

  9. SVN目录权限设置

    ---恢复内容开始--- 如图,这里我建的项目库为myRepositories,其下边又有许多文件,现在要分别对每个文件进行svn权限配置. 配置 进入上面生成的文件夹conf下,进行配置.有以下几个 ...

  10. Xshell通过ssh方式连接Linux服务器,通过Xftp进行文件传输

    准备工作: 一.Linux服务器一台,并配置ssh(本文以腾讯云服务器为例). 1.生成秘钥 打开腾讯云控制台,依次选择:总览->云服务器->SSH秘钥 点击创建秘钥,输入秘钥名称,点击确 ...