2011-04-21 178 views
0

注意:如何處理多個Ajax請求

我放棄了試圖一次完成處理,並讓它在每發送一次x後都返回。

兩條路, /SMS?動作=發送 /SMS?行動=狀態

假設發送路徑開始發送通過REST API調用萬條短信。

我通過ajax打電話給那個頁面。

然後每隔幾秒鐘撥打一次/ sms?action = status以查看進度如何進展並更新進度欄。

如果沒有消息正在發送,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); 
     } 
     }); 

}

+0

也許我不清楚,具體細節並不重要,2個Ajax調用,一個啓動一個過程需要一兩分鐘,併發送一堆電子郵件或短信,另一個Ajax調用,可以獲取已發送的消息數量,或百分比或其他。在進程調用結束之前,狀態調用似乎不會發生。這就是我想要解決的問題。 – merlincam 2011-04-22 13:40:02

回答

0

我可能會錯過了點,但是$( 「DIV#smssend」)點擊裏面你有這條線:

smsStatus(); 

不該」它是:

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

和INSIDE成功:功能(數據)爲/ admin/sms?

0

如果發送部分正在發送10k條消息,並且如果當前正在發送消息,則狀態返回true,如果在發送之間則返回false,則說明您有設計問題。

例如,應該顯示的狀態是什麼?

如果狀態顯示已經發送了某個塊的數量,那麼您可以做的是提交要發送的消息(或地址),並獲取該塊的某個ID。

然後,當你要求一個狀態時,傳遞該ID,並且你的服務器可以確定該組已經發送了多少,並且返回成功和失敗的數字,以及還有多少仍在等待處理。如果你想變得有趣,你還可以在完成之前指出它還有多長時間,根據還有多少其他請求正在等待。

但是,如何處理這個問題真的取決於您在詢問狀態時的期望。

+0

狀態將返回發送的消息數量,如果當前沒有消息正在發送,則返回false。 – merlincam 2011-04-22 13:17:54