我使用axios
处理ajax请求,使用reactJS
flux
渲染UI。在我的应用程序中,有第三方时间线(reactJS组件)。时间线可以通过鼠标滚动来管理。在任何滚动事件之后,应用程序都会发送实际数据的ajax请求。问题是服务器上的请求处理可能比下一个滚动事件慢。在这种情况下,应用程序可能有几个(通常为2-3个)请求,由于用户进一步滚动,这些请求已经被弃用。这是一个问题,因为每次收到新数据时,时间线都开始重新绘制。(因为它是reactJS flux)因此,用户可以多次看到时间线的来回移动。解决这个问题的最简单方法是中止之前的ajax请求,如jQuery
。例如:
$(document).ready(
var xhr;
var fn = function(){
if(xhr && xhr.readyState != 4){
xhr.abort();
}
xhr = $.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
如何在axios
中取消/中止请求?
通常,您希望取消之前的ajax请求并忽略其即将到来的响应,只有在该实例的新ajax请求启动时,为此,请执行以下操作:
示例:从 API 获取一些注释:
// declare an ajax request's cancelToken (globally)
let ajaxRequest = null;
function getComments() {
// cancel previous ajax if exists
if (ajaxRequest ) {
ajaxRequest.cancel();
}
// creates a new token for upcomming ajax (overwrite the previous one)
ajaxRequest = axios.CancelToken.source();
return axios.get('/api/get-comments', { cancelToken: ajaxRequest.token }).then((response) => {
console.log(response.data)
}).catch(function(err) {
if (axios.isCancel(err)) {
console.log('Previous request canceled, new request is send', err.message);
} else {
// handle error
}
});
}
使用use效果挂钩:
useEffect(() => {
const ourRequest = Axios.CancelToken.source() // <-- 1st step
const fetchPost = async () => {
try {
const response = await Axios.get(`endpointURL`, {
cancelToken: ourRequest.token, // <-- 2nd step
})
console.log(response.data)
setPost(response.data)
setIsLoading(false)
} catch (err) {
console.log('There was a problem or request was cancelled.')
}
}
fetchPost()
return () => {
ourRequest.cancel() // <-- 3rd step
}
}, [])
注意:对于POST请求,将取消令牌作为第三个参数传递
Axios.post(`endpointURL`, {data}, {
cancelToken: ourRequest.token, // 2nd step
})
<罢工> Axios目前不支持取消请求。请看 本期详情。
<罢工>更新:axios v0.15中添加了取消支持。
编辑:axios取消令牌API基于撤回的可取消promise提案。
更新2022:从v0.22.0开始,Axios支持AbortController以fetch API方式取消请求:
例:
js prettyprint-override">const controller = new AbortController();
axios.get('/foo/bar', {
signal: controller.signal
}).then(function(response) {
//...
});
// cancel the request
controller.abort()
我使用处理ajax请求,使用渲染UI。在我的应用程序中,有第三方时间线(reactJS组件)。时间线可以通过鼠标滚动来管理。在任何滚动事件之后,应用程序都会发送实际数据的ajax请求。问题是服务器上的请求处理可能比下一个滚动事件慢。在这种情况下,应用程序可能有几个(通常为2-3个)请求,由于用户进一步滚动,这些请求已经被弃用。这是一个问题,因为每次收到新数据时,时间线都开始重新绘制。(因为它是re
问题内容: 我有一个AJAX请求,将每5秒发送一次。但是问题出在AJAX请求之前,如果先前的请求没有完成,我必须中止该请求并提出新的请求。 我的代码是这样的,如何解决这个问题? 问题答案: jQuery ajax方法返回一个XMLHttpRequest对象。您可以使用此对象取消请求。 XMLHttpRequest具有中止方法,该方法会取消请求,但是如果请求已经发送到服务器,那么即使我们中止请求 ,
问题内容: 我在Firefox 14.0.1中使用Firebug 1.10.2。显示网页时,Firebug附加组件具有以下“行为”: 根据Ajax请求,Firebug的“已中止”消息 。 我应该怎么做?是否由于存在某些错误而必须改进我的Web应用程序是否非常危险,或者是Firebug错误或其他原因? 问题答案: 请在此处查看XHR open()的文档示例:https : //developer.m
问题内容: 在AngularJS中给出Ajax请求 如果启动另一个请求(相同的后端,例如不同的参数),取消该请求的最有效方法是什么? 问题答案: 此功能通过超时参数添加到1.1.5版本中:
问题内容: 使用此代码: 如何取消请求并丢弃数据,否则,如何在onSuccess方法中识别请求(使用名称/向导/任何名称),以便我可以确定哪个请求已完成? 我正在考虑做一个array.push(pendingRequest)来跟踪挂起的请求 我想允许用户中断他们的请求,更改输入值并重新提交。 有时,原始请求会在新请求之后结束,而我会用“旧”数据替换“正确”数据。(例如,搜索结果在第一个查询中返回5
问题内容: 我对如何使用axios上传进度事件感到有些困惑。实际上,我正在将大量文件存储到AWS s3中。为此,如何获得上传进度?我需要这个功能 目前,我的发帖请求是这样的: 问题答案: Axios存储库中有一个明确的示例,说明了如何执行此操作:https : //github.com/mzabriskie/axios/blob/master/examples/upload/index.html