如何处理多个ajax请求

时间:2011-04-21 23:34:03

标签: php javascript jquery ajax drupal

注:

我放弃了尝试一次完成处理,并在每x次发送后让它返回。

两条路, / SMS?行动=送 / SMS?动作=状态

假设发送路径开始通过REST api调用发送10,000条短信。

我通过ajax调用该页面。

然后每隔几秒钟,我会调用/ sms?action = status来查看进度如何,并更新进度条。

如果没有发送消息,则状态路径返回false。

最终发生的事情是对SEND路径的ajax调用获得了ajax成功:几乎立即调用的函数,即使我知道脚本需要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 :(得分:0)

我可能会忽略这一点,但在$(“div #smssend”)中。点击你这一行:

smsStatus();

不应该是:

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

和INSIDE成功:/ admin / sms的函数(数据)?

答案 1 :(得分:0)

如果发送部分发送10k消息,如果当前正在发送消息则状态返回true,如果在发送之间则返回false,则表示存在设计问题。

例如,应该显示的状态是什么?

如果状态是显示已发送的某个块的数量,那么您可以做的是提交要发送的消息(或地址),并获取该块的一些ID。

然后,当您要求提供状态时,传递该ID,您的服务器可以确定该组已发送了多少,并返回成功但未成功的号码,以及仍有多少号码待处理。如果你想获得想象力,你也可以根据有多少其他请求待定,在完成之前给出一个指示它可能还有多长时间。

但是,你如何处理这个问题取决于你在要求状态时的期望。