代码之家  ›  专栏  ›  技术社区  ›  Lelio Faieta

在Ajax调用期间发送中间消息

  •  2
  • Lelio Faieta  · 技术社区  · 7 年前

    假设我们有一个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将一个接一个地被每个消息更新。是否可行?是否可以在请求和响应之间发送一些消息?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jovan Perovic    7 年前

    所有的注释实际上都忽略了这样一个事实:HTTP服务器可以将流式响应发送回客户机。

    一些PHP框架已经实现了这一点( Symfony ,请 Laravel 等等)。如果你渴望在没有工作的情况下工作,那当然是可能的,你可以先确保

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

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

    当你用的时候事情会变得有点复杂 FastCGI .代理服务器可以自行选择缓冲,从而将流式响应呈现为正常响应。在这种情况下,您可能希望包括 flush() 每次呼叫后立即呼叫 ob_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体系结构,那么一般来说,这可能更适合。

    希望这有点帮助…