【问题标题】:Send intermediate messages during an Ajax call在 Ajax 调用期间发送中间消息
【发布时间】:2018-06-15 14:56:03
【问题描述】:

假设我们有一个 Ajax 调用。这只是一个例子:

  function delete_mov(id){
    $.ajax("delete_mov.php?id="+id
    )
    .success(function(){
      $('#message').("Movimento "+id+" correttamente cancellato");
    })
    .fail(function(){
      $('#message').("Problemi a cancellare il movimento "+id);
    });
  }

它将按预期工作。假设后面的 PHP 需要一些时间来执行,并且 php 代码在完成执行步骤时会发送一些消息。例如:

<?php
//do first part of code
echo "First step completed";
//do second part of code
echo "Second step completed;
//do third part of code;
echo "Third step completed;
//do last part of code
//send success message back to Ajax
?>

我想做的是在每条消息被 PHP 回显时从 ajax 调用接收回,以便消息 div 将随着每条消息一个接一个地更新。可行吗?是否可以在请求和响应之间发送一些消息?

【问题讨论】:

  • 我相信 PHP 会执行所有这些并一起发送。 ajax 调用需要多长时间?
  • 每条消息一个接一个地查看需要足够的时间
  • 您可以使用 2 个 ajax 调用。一个完成工作的人。第二个将检查代码到达的位置。您可以创建一个将数据放入会话变量的逻辑。在检查期间,您可以检查当前状态的会话变量
  • 问题是在同一个 Ajax 调用中是否可行。我不是在寻找解决方法。
  • 没有。您不能在单个 AJAX 调用中执行此操作。您需要进行主要调用,然后进行单独的 AJAX 调用,这些调用会转到另一个页面,该页面报告第一个请求的状态(因此您将需要一些识别该操作的方法)。如果这是一个运行时间很长的操作,Websockets 可能会更好地解决这个问题

标签: php jquery ajax


【解决方案1】:

所有的 cmets 都忽略了 HTTP 服务器可以将流式响应发送回客户端的事实。

几个 PHP 框架已经实现了这个功能(SymfonyLaravel 等...)。如果您渴望在没有人的情况下工作,那当然是可能的,您可以从确保这一点开始

  1. 您的 PHP 后端会更频繁地刷新输出缓冲区(通过输出缓冲),而不是最后刷新:

    ob_start();
    echo "First";
    ob_flush();
    sleep(1);
    echo "Second";
    ob_flush();
    sleep(3);
    echo "Final";
    ob_flush();
    

当您使用一些FastCGI 时,事情会变得有点复杂。代理服务器可以选择自行缓冲,从而将您的流式响应呈现为正常响应。在这种情况下,您可能希望在每个 ob_flush() 之后包含 flush() 呼叫。此外,您可能还需要发送额外的标头以提示服务器停止缓冲。

  1. 您的 JS 前端使用 progress 回调。看这个问题的例子:What is the cleanest way to get the progress of JQuery ajax request?

    $.ajax({....})
        .done(function(){ ....... })
        .fail(function(){ ....... })
        .progress(function(value) {  
            console.log('Progress: ', value + "%");
        }
    

但是,如果您已经有一个 websocket 架构,那么一般来说这可能更合适。

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2011-06-15
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多