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

如何在jQuery中延迟请求?实现每秒发送一个PHP请求的方法

实现jQuery请求的延迟串行发送(每秒一个)

这个问题很常见——同时批量发送请求很容易给服务器造成不必要的压力,甚至可能因为并发过高触发限流,或者导致部分请求失败。我们可以通过串行化请求+延迟触发的方式,实现每秒发送一个请求到PHP文件,这里给你两种可靠的实现思路:

方案1:递归+setTimeout(推荐,确保请求完成再发下一个)

这种方式会等待上一个请求完全完成(不管成功还是失败),再延迟1秒发送下一个,能避免请求叠加的问题,稳定性更高。

完整代码示例

// 绑定触发事件(比如点击按钮)
$('#batch-send-btn').click(function() {
    // 先禁用按钮,防止重复触发
    $(this).prop('disabled', true);

    // 收集所有选中复选框的数据(这里以val()为例,你可以换成data-id等属性)
    const selectedItems = $('input[type="checkbox"]:checked').map(function() {
        return $(this).val();
    }).get();

    // 没有选中项的话直接返回
    if (selectedItems.length === 0) {
        alert('请先选择要处理的项');
        $(this).prop('disabled', false);
        return;
    }

    // 定义递归函数,逐个发送请求
    function sendNextRequest(index) {
        // 终止条件:所有项都处理完了
        if (index >= selectedItems.length) {
            console.log('所有请求已处理完毕!');
            $('#batch-send-btn').prop('disabled', false); // 重新启用按钮
            return;
        }

        const currentItem = selectedItems[index];

        // 发送AJAX请求到PHP文件
        $.ajax({
            url: 'your-process-file.php', // 替换成你的PHP文件路径
            method: 'POST', // 根据需求选GET/POST
            data: { item_id: currentItem }, // 传递给PHP的参数
            success: function(response) {
                console.log(`处理项 ${currentItem} 成功:`, response);
                // 这里可以添加成功后的UI更新,比如给对应复选框打勾
            },
            error: function(xhr, status, error) {
                console.error(`处理项 ${currentItem} 失败:`, error);
                // 失败后的处理,比如标记错误
            },
            complete: function() {
                // 不管请求成功还是失败,1秒后发送下一个请求
                setTimeout(function() {
                    sendNextRequest(index + 1);
                }, 1000);
            }
        });
    }

    // 启动第一个请求
    sendNextRequest(0);
});

代码说明

  • 先收集所有选中的复选框数据,存到数组里方便逐个处理
  • 递归函数sendNextRequest负责处理单个请求,每次完成后延迟1秒调用自身处理下一个项
  • 添加了按钮禁用/启用逻辑,防止用户重复触发
  • 兼容请求成功/失败的情况,确保流程能继续走下去

方案2:setInterval(固定间隔发送,适合请求耗时稳定的场景)

如果你的PHP接口处理速度非常稳定(肯定在1秒内完成),也可以用setInterval来实现固定每秒发送一个请求,但要注意如果请求耗时超过1秒,会出现多个请求同时在跑的情况,所以这种方式不如递归可靠。

代码示例

$('#batch-send-btn').click(function() {
    $(this).prop('disabled', true);
    const selectedItems = $('input[type="checkbox"]:checked').map(function() {
        return $(this).val();
    }).get();

    if (selectedItems.length === 0) {
        alert('请选择要处理的项');
        $(this).prop('disabled', false);
        return;
    }

    let currentIndex = 0;
    const intervalId = setInterval(function() {
        if (currentIndex >= selectedItems.length) {
            clearInterval(intervalId);
            console.log('所有请求发送完成');
            $('#batch-send-btn').prop('disabled', false);
            return;
        }

        const currentItem = selectedItems[currentIndex];
        $.ajax({
            url: 'your-process-file.php',
            method: 'POST',
            data: { item_id: currentItem },
            success: function(res) {
                console.log(`项 ${currentItem} 处理成功`);
            },
            error: function(err) {
                console.error(`项 ${currentItem} 处理失败`);
            }
        });

        currentIndex++;
    }, 1000); // 每秒执行一次
});

额外注意事项

  • PHP端要做好参数校验和异常处理,避免因为单个请求的错误影响整个流程
  • 如果需要更精确的延迟,可以根据请求耗时动态调整延迟时间(比如用Date计算上一个请求的耗时,再用1000减去耗时作为下一次的延迟)
  • 可以添加进度提示,比如显示“已处理X/Y个项”,提升用户体验

内容的提问来源于stack exchange,提问作者walker2k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:00:11