Как обрабатывать несколько запросов AJAX - PullRequest
0 голосов
/ 22 апреля 2011

ПРИМЕЧАНИЕ:

Я отказался от попыток выполнить обработку за один раз и просто позволил ей возвращаться после каждого x числа отправлений.

Два пути, / sms? Action = send / sms? Action = status

Предположим, что путь отправки начинает отправку 10 000 SMS-сообщений через вызовы REST API.

Iпозвоните на эту страницу через ajax.

Затем каждые несколько секунд я звоню / sms? action = status, чтобы посмотреть, как идет процесс, и обновить индикатор выполнения.

Путь состояния возвращает значение false, если сообщения не отправляются.

В конечном итоге происходит то, что вызов ajax на путь SEND получает функцию ajax success: вызывается почти мгновенно, хотя я знаю, что сценарийНа выполнение выполнения уходит более 1 минуты.

Мой индикатор выполнения никогда не отображается, поскольку вызов состояния ajax (который находится в заданном интервале с задержкой в ​​несколько секунд) никогда не вызывается, пока не завершится вызов отправки.

Я пытаюсь поместить соответствующий код здесь, но он может быть не таким ясным, как это должно быть без всего контекста.

<script type="text/javascript">
var smsInterval = 0;
var smsSending = false;

$(document).ready(function() {
  var charCount = 0;
  var smsText = "";
  var smsTotal = <?php echo $options["smsTotal"]; ?>;


  <?php if($options["sending"]): ?>
     smsStatus();
     smsSending = true;
     smsInterval = setInterval("smsStatus()", 5000);

  <?php endif; ?>
  $("span#smsadmin_charcount").html(charCount.toString());


  //send button
  $("div#smssend").click(function() {
     if(smsSending == true) {
        return false;
     }

     smsStatus();

     var dataString = $("#smsadmin_form").serialize();
     smsSending = true;
     $("div#smssend").html("Sending...");
      $.ajax({
        type: "POST",
        url: "<?php echo $base_url; ?>/admin/sms",
        data : dataString,
        success: function(data) {

        },
        error: function(request, error) {
           $("div.notice.sms").html("ERROR "+error+ "REQUEST "+request);
        }
        });
  });
  });

  function smsStatus() {
  var dataString = "smsaction=status&ajax=true";

      $.ajax({
        type: "POST",
        url: "<?php echo $base_url; ?>/admin/sms",
        data : dataString,
        success: function(data) {
           //data being false here indicates the process finished
           if(data == false) {
              clearInterval(smsInterval);
              var basewidth = $("div.sms_progress_bg").width();
              $("div.sms_progress_bar").width(parseInt(basewidth));
              $("div.sms_progress_notice").html(parseInt(100) + "% Complete");
              smsSending = false;
              $("div#smssend").html("Send To <?php echo $options["smsTotal"]; ?> Recipients");
           } else {
              var pcomplete = parseFloat(data);

              $("div.sms_progress_bg").show();
              var basewidth = $("div.sms_progress_bg").width();
              $("div.sms_progress_bar").width(parseInt(basewidth * pcomplete));
              $("div.sms_progress_notice").html(parseInt(pcomplete * 100) + "% Complete");
           }
        },
        error: function(request, error) {
           $("div.notice.sms").html("ERROR "+error+ "REQUEST "+request);
        }
        });

} ​​

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

Если отправляющая часть отправляет 10 тыс. Сообщений, и статус возвращает значение true, если в данный момент отправляется сообщение, и значение false, если между отправкой имеется проблема с дизайном.

Например, что должен показывать статус?

Если в статусе указано, сколько из определенного блока было отправлено, то вы можете отправить отправляемое сообщение (или адреса) и получить некоторый идентификатор для этого блока.

Затем, когда вы запрашиваете статус, передайте идентификатор, и ваш сервер сможет определить, сколько из этой группы было отправлено, и вернуть обратно номер, который был успешным и неуспешным, а сколько еще ожидает рассмотрения. Если вы хотите получить фантазию, вы также можете указать, сколько времени может пройти до завершения, исходя из количества ожидающих выполнения других запросов.

Но то, как вы к этому подходите, зависит от того, что вы ожидаете, когда спросите о статусе.

0 голосов
/ 22 апреля 2011

Возможно, я упускаю точку, но внутри $ ("div # smssend"). Щелкните, чтобы вы получили эту строку:

smsStatus();

не должно быть:

smsInterval = setInterval("smsStatus()", 5000);

и ВНУТРИ успеха: функция (данные) для / admin / sms?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...