我已經做了遵循類似的模式幾種形式爲不HTML表格前完成AJAX請求設計模式:需要提交
兩個相互依存的表單域,讓我們說「街道地址」和「位置」(lon/lat)。
當用戶填寫一個字段時,另一個字段通過ajax調用進行更新。 (例如,如果用戶填寫街道地址,請求地理編碼API並將結果放在位置字段中;如果用戶填寫位置(例如,通過地圖UI),則執行請求到反向地理編碼API和結果放在地址欄。 至今沒問題,這些都是很容易鉤到模糊和/或聚焦變化事件。)
如果表單提交,會出現問題在ajax調用完成之前。在這種情況下,一個字段將具有正確的值,另一個字段將陳舊。服務器上的處理程序需要檢測到發生這種情況並更新陳舊值。我們不能只檢查默認值,因爲用戶可能已經更改了兩個字段的任何次數。
有兩種可能的解決方案我想過,我也不太喜歡任何一種。我很樂意提供其他建議。
溶液1使用隱藏字段的標誌,以指示新鮮度:默認值設置爲0,則AJAX請求被髮送之前重置爲0,並且它在響應返回設置爲1。在服務器端,檢查這些字段並重新計算其新鮮度標誌設置爲0的任何字段。這裏仍存在潛在的競爭條件,但窗口大大縮小。我已經使用了這種技術,它可以工作(例如,http://fixcity.org/racks/new/)。這很煩人,因爲它需要在客戶端和服務器上有更多的代碼,並且是另一個可能的錯誤來源。
解決方案2.改爲使用同步AJAX調用(「SJAX」?)。沒有吸引力,因爲這裏的AJAX只是一個用戶界面的便利,它並不是必須的,因此我寧願不讓事情變得緩慢 - 那麼它就變成了用戶界面*。
解決方案3.總是進行服務器端後處理。如果價格昂貴,請使用緩存使其更便宜 - 例如。如果值爲而不是陳舊,這意味着客戶端只是通過AJAX提出了相同的請求,所以我們應該在AJAX處理程序期間根據需要填充緩存。 這一個目前似乎是最吸引我的,雖然它有兩個限制: 它不能用於不安全和冪等的東西 - 例如。如果AJAX請求正在執行POST;它甚至不能用於這個例子,因爲我們有兩個相互依賴的字段,無法知道哪個是正確的,哪個是陳舊的。
好的,這聽起來像是解決方案1的客戶端唯一變體。一方面它更好,因爲服務器端的功能更少,另一方面提交將被阻止,直到ajax響應結束。 – slinkp 2011-03-01 22:07:28