场景:

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

  快速点击会发送多次请求,多次点击的时候一般的做法我们会定义一个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. 关于Cocos2d-x中掉帧导致游戏一卡一卡的网上一些的解决方法

    方法1 掉帧主要是setpostion引起的  因为每一帧每一个精灵都要set一次虽然不知道为什么会这样但是if(poX<1000&&pox>-100){     xx-& ...

  2. 在 C++ 程序中只使用 const 常量而不使用宏常量

    在 C++ 程序中只使用 const 常量而不使用宏常量,即 const 常量完 全取代宏常量. #include <iostream> /* run this program using ...

  3. (转)使用AfxGetMainWnd函数的一个心得

    作者:朱金灿 来源:http://blog.csdn.net/clever101/ 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法.但是你会发现这一做法有时也会失灵.不 ...

  4. 在linux上开发210的hdmi-servers输出

    这段时间一直在研究hdmi-servers,因为友善对这个在是闭源的,所以由于兴趣的关系和工作的关系,决定自己写一个hdmi-servers. 在hdmi中,最关键的是弄清楚了Hdmi显示数据的怎么来 ...

  5. apache -- 端口被占用

    需求不断变更,总会安装不同的软件,这些软件理想情况下会使用不同的端口,但还是有软件之间端口被占的情况. 最近在电脑上装了一个VMware虚拟机软件,结果导致开启本机的Apache服务无法启动,报 “T ...

  6. UVA - 11920 0 s, 1 s and ? Marks

    Description  0 s, 1 s and ? Marks  Given a string consisting of 0, 1 and ? only, change all the ? to ...

  7. Vuforia AR实战教程

    官网:https://developer.vuforia.com/ Vuforia AR实战教程 http://www.taikr.com/my/course/531. AQaVpF//////AAA ...

  8. php错误:You don't have permission to access / on this server.

    以前php环境崩溃了,重新装了个,打开第一个文件就出现: You don't have permission to access / on this server.错误,让我情以何堪啊,居然说我此台服 ...

  9. javascript测试框架 Mocha 实例教程

    http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

  10. 理解ASP.NET MVC中的ActionResult

    通常我们在一个ASP.NET MVC项目中创建一个Controller的时候,Index()方法默认的返回类型都是ActionResult,通过查看UML图,ActionResult实际上是一个抽象类 ...