如何在jQuery中持续调用Ajax请求直至获取响应并停止重复调用?
解决Ajax长请求超时后持续重试且避免重复请求的问题
首先咱们梳理下你的核心困境:目标接口需要2分钟才能完成响应,但浏览器默认1分钟就会触发超时返回504;你之前的代码会无差别重复发起请求,既容易造成请求堆积,也不知道怎么在成功拿到响应后停止循环。
下面是针对性优化后的方案,重点解决避免重复请求和成功后自动停止重试两个核心需求:
// 定义标志位,标记当前是否有请求在处理中 let isRequestInProgress = false; function fetchdata() { // 如果已有请求在运行,直接返回,不重复发起 if (isRequestInProgress) return; isRequestInProgress = true; $.ajax({ url: 'fetch_details.php', type: 'post', // 手动设置超时时间为70秒,尽量贴近接口实际响应时长 timeout: 70000, success: function(data) { // 成功拿到响应,执行你的业务逻辑 alert(data); // 成功后无需再重试,自然终止循环 }, error: function(xhr, status, error) { // 仅在超时或收到504错误时,才发起下一次重试 if (status === 'timeout' || xhr.status === 504) { setTimeout(fetchdata, 5000); } }, complete: function() { // 请求完成(无论成功失败),重置标志位,允许后续发起新请求 isRequestInProgress = false; } }); } $(document).ready(function(){ // 初始化第一次请求 fetchdata(); });
关键优化点说明:
- 请求防重复:通过
isRequestInProgress标志位,确保同一时间只有一个请求在发送,彻底避免多个请求同时堆积的问题。 - 按需重试:只在请求超时(
timeout状态)或者收到504错误时,才计划下一次重试;成功拿到响应后自动停止循环,不再发起多余请求。 - 超时适配:手动设置
timeout为70秒,尽量匹配接口的实际响应时长,减少浏览器提前触发超时的概率。
额外小建议:如果后端允许的话,更推荐改成轮询查询任务状态的模式——比如先发起一个请求触发后台任务,之后每隔一段时间查询任务是否完成,这种模式比一直挂着长连接更稳定,也更契合浏览器的请求机制。
内容的提问来源于stack exchange,提问作者Gurudas k s
相关产品推荐
相关产品推荐

