1

我有一个调用服务器并运行一个长进程的ajax(这个进程正在将状态写入数据库)。

我有其他 ajax(递归)来获取长进程的状态并在进度条上设置参数。

我的问题是第二个 ajax 直到第一个完成后才开始。有没有办法发送第一个 ajax 而无需等待响应?

有任何想法吗?

我很感激任何建议,我对这个问题有点厌倦。

如果还有其他方法可以发送长进程并获取长进程的状态,请告诉我。

谢谢!

这是我的代码,以防万一

executeProgressBar(1, token);

$.ajax({
  type: "POST",
  enctype: 'multipart/form-data',
  processData: false,
  contentType: false,
  cache: false,
  url: "/long_process",
  data: form_data,
  success: function (response) {
    //NOTHING
  }
});

function executeProgressBar(start, token) {

  if (start == 1) {

    //reset progress bar
    $('.progress-bar').css('width', '0%');
    $('.progress-bar').text('0%');
    $('.progress-bar').attr('data-progress', '0');

  }

  $.ajax({
    type: "POST",
    url: "/progress_bar_status",
    data: { token: token, sleep: 0 },
    success: function (response) {

      $('.progress-bar').css('width', response['percentage'] + '%');
      $('.progress-bar').text(response['percentage'] + '%');
      $('.progress-bar').attr('data-progress', response['percentage']);

      $('#done').text(response['executed']);
      $('.execute-time').text('tiempo');

      if (response.percentage == 100) {
        $('.end-process').show();
      } else {
        executeProgressBar(0, token);
      }
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      if (textStatus == 'parsererror') {
        textStatus = 'Technical error: Unexpected response returned by server. Sending stopped.';
      }
      alert(textStatus);
    }
  });
}

编辑

我在服务器端解决了这段代码 - php

        /************** Close connection and return echo message **************/
        ob_end_clean();
        header("Connection: close");
        ignore_user_abort(true);
        ob_start();
        echo('text response to ajax');
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush();
        flush();

        // if you're using sessions, this prevents subsequent requests
        // from hanging while the background process executes
        if (session_id()) {
            session_write_close();
        }

        /************** background process starts here **************/

在这篇文章中查看:如何提前关闭连接?

4

1 回答 1

0

您正在executeProgressBar立即调用而不是等待第一个 AJAX 调用完成。executeProgressBar在方法回调中调用函数success并将其传递给executeProgressBar函数并修改参数,如下例所示。

一定要建立一个检查,让递归函数知道何时停止。

$.ajax({
    type: "POST",
    enctype: 'multipart/form-data',
    processData: false,
    contentType: false,
    cache: false,
    url: "/long_process",
    data: form_data,
    success: function (response) {
        executeProgressBar(1, token, response);
    }
});

function executeProgressBar(start, token, response) {

    if (start == 1) {

        //reset progress bar
        $('.progress-bar').css('width', '0%');
        $('.progress-bar').text('0%');
        $('.progress-bar').attr('data-progress', '0');

    }

    $.ajax({
        type: "POST",
        url: "/progress_bar_status",
        data: {token: token, sleep: 0},
        success: function (response) {

            $('.progress-bar').css('width', response['percentage'] + '%');
            $('.progress-bar').text(response['percentage'] + '%');
            $('.progress-bar').attr('data-progress', response['percentage']);

            $('#done').text(response['executed']);
            $('.execute-time').text('tiempo');

            if (response.percentage == 100) {
                $('.end-process').show();
            } else {
                executeProgressBar(0, token, response);
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            if (textStatus == 'parsererror') {
                textStatus = 'Technical error: Unexpected response returned by server. Sending stopped.';
            }
            alert(textStatus);
        }
    });
}
于 2020-06-02T21:25:19.110 回答