2009-11-10 41 views
1

我想要做的事情涉及通過一系列複選框。每個()循環內的Ajax調用不是異步的

對於它們中的每一個它被檢查,我必須執行一些計算(使用ajax調用)。如果出現錯誤,我必須打破循環並返回消息。

每個ajax調用都需要大約0.4秒的時間才能完成,但這永遠不會成爲問題,因爲在任何給定時間只能檢查其中最多4個。

但是我面臨的問題是,最後的警告框彈出之前,錯誤函數()內的一個。錯誤函數確實有效,但總是在最後一個之後出現。

我的印象是,通過將調用定義爲異步= false,代碼執行將等待直到調用返回響應。這是一個錯誤的假設?

有沒有辦法做到這一點?

在此先感謝

$("input[id*='chk_aut']").each(function() { 
    if(this.value=="on") { 
    $.ajax({ 
     type: "GET", 
     url: "testpage.asp", 
     cache:"false", 
     async:"false", 
     data: "which=checkvalues&value=" 
      + i_value 
      + "&ref="+$("#cb_ref").val() 
      + "&nif="+$("#txt_nif").val() 
      + "&day="+i_day 
      + "&month="+i_month 
      + "&hours="+i_hours 
      + "&year="+i_year + "&ms=" 
      + new Date().getTime(), 
     success: function(msg) { 
     //do something but continue the loop 
     }, 
     error: function() { 
     i_result =false; 
     alert("An error has occurred"); 
     return false;//break the loop 
     } 
    }); 
    } 
}); 
alert(i_result); 

回答

7

我認爲你需要使用

,async: false 

讓你通過布爾,不是字符串「假」。這應該讓你的AJAX調用同步。

查看this question瞭解相似的情況和一些更多的細節。特別是,您可能會發現,對於同步AJAX調用,您不能使用成功處理程序,並且必須在調用完成後返回結果(您超出了AJAX調用本身的範圍)。

如果在所有可能的情況下,您應該嘗試重構您的代碼,以便它可以異步工作。同步執行不能很好地轉換到瀏覽器。

在你的情況下,如果你正在使用每個AJAX調用來累積每個選中的複選框的結果,可以考慮將工作值存儲在一個窗口變量中,並跟蹤哪些請求已返回。當您確定您已收到針對您發起的每個AJAX調用的成功響應時,可以啓動警報框或您想要對結果執行的任何其他操作。這只是你如何開始異步思考的一個例子。

+0

我將嘗試按照您描述的方式使用async參數。我有這種情況的替代代碼(不使用async:false),但我很好奇它爲什麼不按預期的方式工作。 – 2009-11-10 15:09:01

+0

已經嘗試使用布爾值但無濟於事。 仍然有相同的結果。 – 2009-11-11 10:34:28

+0

將您的建議應用於緩存參數,並且所有內容均按預期工作。感謝您花時間回答這個問題。 – 2009-11-11 14:25:34

0

我不熟悉Ajax調用async選項。我一直在使用jQuery阿賈克斯經理成功,我需要同步的Ajax調用情況:http://plugins.jquery.com/project/AjaxManager

+0

感謝您的提示。似乎值得深入研究。 – 2009-11-10 15:26:39

6

正如manual提到的,error功...

的函數被調用,如果請求失敗。

也就是說,如果客戶端和服務器之間存在通信問題(例如:超時,沒有授權等)。當您的服務器端腳本返回一個在您的應用程序中被認爲是錯誤的值時,它不會被調用。將該代碼移動到success,並檢查響應數據以查看腳本如何處理每個請求。

另外,我要指出,你需要有真的很好的理由使用同步調用。是的,在您的測試中,只需要1.5秒,但是當某人連接速度緩慢,或者您的服務器負載過重或無法使用時會發生什麼?同步請求會凍結客戶端的瀏覽器(即,甚至不會更改標籤頁或滾動工具等),並導致用戶體驗不佳。如果你想阻止你的頁面上的用戶界面,有很多友好的方式來做到這一點。例如,檢查出BlockUI

使用回調並開始異步思考而不是程序化要好得多。當你第一次開始時(這是因爲你的代碼不一定按照行順序運行),這是一個艱難的過程,但是一旦你掌握了它,它就非常強大和靈活。

+0

我知道在這種情況下不應該調用錯誤函數。爲了澄清我在一些錯誤的地方粘貼了一些代碼。現在編輯並感謝您的支持。註釋掉你的評論。 – 2009-11-10 15:11:49

4

使用async:false而不是async:"false"並享受。