2012-09-22 112 views
1

我有一個腳本幾個Ajax請求,一些同步異步一些我用pload.gif時顯示一個Ajax請求的有效範圍超過1秒。我發現在一種情況下,即使請求成功並且預期的操作完成,pload.gif也會繼續顯示。 N:B:沒有其他請求已被觸發,即$ .active = 1。但ajaxStop不會觸發此外,我已經測試了ajaxComplete和ajaxSuccess(不是我想要的這些,因爲我想捕獲任何異步請求),這些也不會觸發無論是。

這裏是有問題的請求:

$.ajax({ 
    beforeSend: function(){ 
     $("#loading p").append("validate class schedules"); 
     console.log("validate class schedules"); 
    }, 
    type: "POST", 
    url: "../_admin/admin_Validate_Class_Schedule.php", 
    data: {class_Key: current_Class_Key, schedule_Key : current_Schedule_Key}, 
    dataType: "text", 
    async: false, 
    success: function(return_Data){ 
     console.log("success"); 
     var result = $.trim(return_Data); 
     console.log("result: " + result + " " + "call count: " + call_Count + " : " + $("#schedule_Description").val() + " " + $("#schedule_Description").val().length + " " + current_Class_Key); 

     if (result == "exists"){ 
      $("#create_Schedule .form_Submit").attr("value", "Update Schedule"); 
      $("#create_Schedule").attr("action", "process_Schedule_Update.php"); 
      $(".form_Footer .form_Submit").css("color", "#fff"); 
      $(".form_Footer .form_Submit").removeAttr("disabled");     
     } else { 
      $("#create_Schedule .form_Submit").attr("value", "Create Schedule"); 
      $("#create_Schedule").attr("action", "process_Schedule_Create.php"); 
      $(".form_Footer .form_Submit").css("color", "red"); 
      $(".form_Footer .form_Submit").attr("disabled","disabled");    
      if ((current_Class_Key.length != 0) && ($("#schedule_Description").val().length != 0)){ 
       $(".form_Footer .form_Submit").css("color", "#fff"); 
       $(".form_Footer .form_Submit").removeAttr("disabled"); 
      } 
     } 
    }, 
    error: function(){ 
     console.log("Validate Could not retrieve XML file."); 
    } 
}); // end ajax call 

我的誘惑是使用下面的成功分支

if ($.active == 1){    // nothing else requested which should be the case 
    $.event.trigger("ajaxStop"); // force a stop 
    $.active = 0;     // force active to zero as belt and braces as not 
}         // sure if triggering stop will set active to zero 

但是我不確定到底 - 這是存儲了一個問題稍後,爲什麼這應該是必要的。我不想在我的所有請求中開始編碼。我希望我的所有請求在完成後減少$ .active。所以我想真正的問題是爲什麼不是這樣?

任何想法歡迎。

回答

1

也許不是直接回答你的,爲什麼它似乎不火的問題,但過於冗長周邊您的問題評論和可能的方式:

您可以使用jQuery的新遞延系統連接阿賈克斯回調。 jQuery對象上的AJAX調用返回延期對象:

var dfd = $.ajax({ 
       beforeSend: function(){ 
        $("#loading p") 
         .append("validate class schedules"); 
        console.log("validate class schedules"); 
       }, 
       type: "POST", 
       url: "../_admin/admin_Validate_Class_Schedule.php", 
       data: {class_Key: current_Class_Key, schedule_Key : current_Schedule_Key}, 
       dataType: "text", 
       async: false 
      }); 

您可以在此對象上使用deferred.thendeferred.done附上您的回調,deferred.fail

dfd.done(function(){ 
    // ajax succes, handle 
}); 
dfd.fail(function(){ 
    // ajax failure, handle 
}); 

// OR 

dfd.then(function(){ 
    // ajax succes, handle 
}, function(){ 
    // ajax failure, handle 
}); 

一旦延期對象被「解決」(這發生在ajax調用完成或失敗時),調用適當的回調函數。即使你已經解決了回調,你的回調會立即觸發(當然如果適用的話)

這是jQuery做事的新方法,它可以爲你節省很多麻煩!它很乾淨,並且使得處理異步性變得更容易。

More info in the docs here

+0

善良,這對我來說是新的。想不到爲什麼我以前沒有碰到過這個。我將不得不更詳細地閱讀。我對此的第一次快速和骯髒的測試似乎已經消除了這個問題。將適當的代碼給它一個去。可能必須稍後再回來並重寫其他請求。 – codepuppy

+0

祝你好運,讓社區知道這是否適合你!如果可能的話,它是如何解決你的特定問題的細節。 – Asciiom

+0

嗨,我沒有聘請推遲在我的解決方案。儘管推遲工作,我可以看到,這是未來的發展方向,但我沒有采用這種方式,原因是我必須重新編寫我的所有請求,以在代碼中提供一致的標準。我承認我無法解釋請求在這個實例中減少$ .active的失敗。隔離了一個例子後,我確信這個單一事件不會發生。我知道這是一個小周,並且很虛弱,但是它完成了這項工作。儘管如此,這一點非常有用,因爲我現在已經被推遲推遲。 – codepuppy