jq和axios的取消请求
场景:
分页: 每次点击分页会发送请求,如果上一次请求还未获取到,下一次请求已经开始且先一步获取到,那么数据上会出现问题。
快速点击会发送多次请求,多次点击的时候一般的做法我们会定义一个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的取消请求的更多相关文章
- 学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求
一.axios的基本使用: ✿ 使用axios前必知细节: 1.axios 函数对象(可以作为axios(config)函数使用去发送请求,也可以作为对象调用方法axios.request(confi ...
- axios浏览器异步请求方法封装 XMLHttpRequest
axios学习笔记defaults(浏览器端异步请求处理方式) 浏览器异步请求方法封装,主要使用XMLHttpRequest lib/adapters/xhr.js //入口 var utils = ...
- axios 取消请求的方法
开发中遇到需要取消请求的功能,,点击终止查询可以取消开始查询请求,再次点击开始查询又可以进行查询. 解决方法:axios官方文档上的CancelToken,一开始用了这个api后,可以成功取消请求,但 ...
- axios 取消请求
解决思路 在发送第二次请求的时候如果第一次请求还未返回,则取消第一次请求,以保证后发送的请求返回的数据不会被先发送的请求覆盖. axios官方文档取消请求说明 方法一: const CancelTok ...
- 使用Typescript重构axios(十八)——请求取消功能:总体思路
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- axios 如何取消已发送的请求?
前言 最近在项目中遇到一个问题,在连续发送同一请求时,如果第二次请求比第一次请求快,那么实际显示的是第一次请求的数据,这就会造成数据和我选择的内容不一致的问题.解决的方案:在后续发送请求时,判断之前的 ...
随机推荐
- selenium测试(Java)--截图(十九)
package com.test.screenshot; import java.io.File; import java.io.IOException; import org.apache.comm ...
- Struts2学习笔记(OGNL表达式)
Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard T ...
- 转载:【原译】Erlang常见注意事项(Efficiency Guide)
转自:http://www.cnblogs.com/futuredo/archive/2012/10/17/2726416.html Common Caveats(常见注意事项) Erlang/OTP ...
- 转载:MochiWeb一些资料的链接
转自:http://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/mochiweb_20091030.txt MochiWeb项目主 ...
- CentOS系统资源常用命令
系统: # uname -a # 查看内核/操作系统/CPU信息 # cat /etc/issue # cat /etc/redhat-release # 查看操作系统版本 # cat /proc ...
- html中可以自定义属性,,,妈的竟然才知道..
html中可以自定义属性,,,妈的竟然才知道.. <input userinfo="没见过帅哥呀" />
- 怎么成为asp.net大神!!!!!!!!!!!!!!!!!!!怎么成为asp.net大神!!!!!!!!!!!!!!!!!!!
怎么成为asp.net大神!!!!!!!!!!!!!!!!!!!怎么成为asp.net大神!!!!!!!!!!!!!!!!!!!怎么成为asp.net大神!!!!!!!!!!!!!!!!!!!怎么成为 ...
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与not ...
- php一些常规动态设置与获取
error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);ini ...
- 简单html弹窗
css: <style type="text/css"> .moneyrecord { display:none; border:0.5em solid #00AAEE ...