【问题标题】:how to show Ajax request progress如何显示 Ajax 请求进度
【发布时间】:2016-01-10 18:36:38
【问题描述】:

我有这个 ajax 请求来更新我的数据库。

function ajax_submit(){
    var submit_val=$("#stato").serialize();
    dest="plan/new_bp1.php";
    $.ajax({
    type: "POST",
    url: dest,
    data: submit_val,
    success: function(data){ 
        data1=data.split("|");
        if(data1[0]=="Successo"){ 
        $("#spnmsg").fadeTo(200,0.1,
            function(){$(this).removeClass().addClass("spn_success").html(data1[1]).fadeTo(900,1)});
        }else if(data1[0]=="Errore"){
        $("#spnmsg").fadeTo(200,0.1,
            function(){$(this).removeClass().addClass("spn_error").html(data1[1]).fadeTo(900,1)});  
        }
    },
    complete: function(){
        setTimeout(function(){ $('.container').load('plan/home.php');},2000); 
    }
    });
}

调用的脚本需要很长时间才能执行,因为它每次必须选择、详细说明和插入大约 4.000 条记录。我现在要做的是在屏幕上添加一个微调器,向用户反馈请求正在运行(由 AjaxStart 和 AjaxStop 触发)。

在调用结束时,完整函数将回显 php 脚本将回显的内容。

我想做的是有一个计数器,它会在脚本执行期间更新,我可以说“处理 4.000 条记录中的 X 条记录”之类的内容 在脚本方面,我可以毫无问题地计算处理的记录数和总体记录数。 如何更新我的脚本以显示进度?

【问题讨论】:

  • 您将完成的操作存储为一个文件或数据库,然后执行另一个 ajax 请求来轮询该文件或数据库,并在第一个 PHP 脚本运行时获取结果
  • 当前请求没有选项接收php脚本回显的反馈?
  • 不是真的,你必须将进度(SSE or Sockets)推送到客户端,或者只是用ajax轮询它,你必须用另一个ajax来做调用,因为您不能使用 ajax 返回部分内容,并且仍然继续工作等等。这通常比第一个假设要难,您不能只坚持使用 jQuery 的 progress 处理程序来处理这样的事情。
  • 知道了。我希望在progress 上错过一些可以帮助我的东西;)

标签: php jquery ajax


【解决方案1】:

你有几个选择。

1) 就在请求开始时,您可以开始轮询另一个端点,该端点仅提供已处理的记录数,如@adeneo 建议的那样。您不必在每次处理记录时都写入文件。您可以将其存储在内存中,并确保您必须处理进入进度的请求的路由处理程序可以访问相同的内存。

2) 在您的服务器上实现一个 websocket 端点,该端点推出已处理记录的数量。基本上,然后在服务器上,您将调用该 Websocket 库代码来推出进度。您还必须在 Javascript 端创建一个 Websocket 连接,这很简单,并监听这些消息。

【讨论】:

  • 关于第 1 点。需要注意的是,PHP 会话存在多个 ajax 请求访问相同会话数据的问题,因此这通常不是一个选项,并且可能会导致很多悲伤(去过那里);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 2011-03-13
  • 2016-02-07
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多