jQuery发送Ajax,没有等待发送其他Ajax的响应

时间:2020-06-02 21:16:59

标签: javascript jquery ajax progress-bar no-response

我有一个调用服务器的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 **************/

在此信息中查看:How do I close a connection early?

1 个答案:

答案 0 :(得分: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);
        }
    });
}