You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:27:47