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

使用jQuery实现邮件发送计数器不更新,仅显示最终数值问题求助

解决jQuery邮件计数器无法实时更新的问题

看起来你遇到的核心问题是:前端没办法实时获取邮件发送的中间进度,只能在所有邮件发送完成后拿到最终总数。这大概率是因为你的后端接口和前端轮询逻辑没配合好,我来帮你拆解问题并给出修复方案:

先找问题根源

你的原代码里,每次调用$.post("/path/to/server")后递归执行自身,但如果这个后端接口是同步处理所有邮件发送的(比如在一个循环里发完所有邮件才返回响应),那前端的请求会一直处于挂起状态,直到所有邮件发完才会收到结果——自然看不到实时更新的过程。

正确的解决方案:拆分后端接口+前端轮询

要实现实时更新,你需要把后端逻辑拆成两个部分,再配合前端的轮询:

1. 后端调整(关键!)

  • 第一个接口:启动邮件发送任务(比如/start-send)。这个接口只负责触发后台异步发送邮件的任务,然后立即返回响应,不要等待邮件发送完成。
  • 第二个接口:查询发送进度(比如/get-send-progress)。这个接口返回当前已经发送完成的邮件数量,以及一个“是否发送完成”的标识(比如is_finished: true/false)。

后端需要在异步发送邮件的过程中,维护一个全局的计数器(比如存在内存、缓存或者数据库里),每次发送成功就更新这个计数器的值。

2. 前端代码修改

前端需要先调用“启动任务”的接口,然后定期轮询“查询进度”的接口来更新UI:

$(document).ready(function() {
    // 轮询进度的函数
    const checkSendProgress = () => {
        $.get("/get-send-progress", function(data) {
            // 假设返回的data是包含count和isFinished的JSON
            if (data.count !== "-1") {
                $("#progressSend").html(`<p class="text-success">Sent ${data.count} emails</p>`);
                
                // 如果还没发送完成,继续轮询(间隔1秒可根据需求调整)
                if (!data.isFinished) {
                    setTimeout(checkSendProgress, 1000);
                }
            }
        });
    };

    // 先启动邮件发送任务,成功后开始轮询进度
    $.post("/start-send", function() {
        console.log("邮件发送任务已启动");
        checkSendProgress();
    }).fail(function() {
        $("#progressSend").html('<p class="text-danger">启动发送任务失败</p>');
    });
});

额外注意事项

  • 如果你的后端是PHP这类语言,不要尝试用输出缓冲(flush)来实时返回中间值——这种方式兼容性差,而且容易出问题,拆分接口是更可靠的方案。
  • 轮询的间隔不要设置得太短(比如小于500毫秒),避免给服务器造成过大压力。
  • 记得在发送完成后停止轮询,避免不必要的请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:11