2010-12-04 25 views
3

處理不按順序的Ajax請求(最好使用jQuery)的最佳方式是什麼?如何處理不按順序的Ajax請求?

例如,每當字段更改時,都會從用戶的瀏覽器發送Ajax請求。用戶可能會將dog_name更改爲「蓬鬆」,但片刻後,她將其更改爲「Spot」。第一個請求由於某種原因而被延遲,因此第二次請求在第二次之後到達服務器,並且她的狗最終被稱爲「蓬鬆」而不是「Spot」。

我可以沿着每個請求傳遞客戶端時間戳,並讓服務器將其作爲每個Dog記錄的一部分進行跟蹤,並忽略先前請求更改相同的字段(但只有當差異小於5分鐘,以防用戶改變機器上的時間)。

這種方法是否足夠健壯,還是有更好的,更標準化的方法?

編輯:

馬特取得了他的評論大點。序列化請求以更改同一個字段會好得多,那麼是否存在實現Ajax請求隊列的標準方式?

編輯#2

在迴應@ cherouvim的評論,我不認爲我有鎖的形式。該字段會更改以反映用戶的更改,將更改請求放入隊列中。如果更改相同字段的請求正在隊列中等待,請刪除該舊請求。 2件事我仍然必須解決:

  1. 將請求放入隊列是一個異步任務。我可以讓來自上一個Ajax請求的回調處理程序發送隊列中的下一個請求。 Javascript代碼不是多線程的(或者...是不是?)

  2. 如果請求失敗,我需要用戶界面來反映上一次成功請求的狀態。因此,如果用戶將狗的名稱更改爲「Spot」並且Ajax請求失敗,則該字段必須設置回「Fluffy」(成功提交的最後一個值)。

我缺少什麼問題?

+0

簡單:不允許多個同時請求相同的字段。如果更改發生得很快,則將它們排隊。 – 2010-12-04 18:07:54

+0

@Matt Ball:你如何「鎖定」客戶端的整個display-form-push-change對話?這不是一個請求/響應週期,而是兩個。 – cherouvim 2010-12-04 18:12:34

回答

3

首先,您需要序列化每個客戶端的服務器端處理。如果您使用Java進行編程,那麼在http會話對象上同步執行就足夠了。序列化將有助於在第一次正在處理時進行第二次更新。

您可以在實體更新中實施的第二項增強功能是http://en.wikipedia.org/wiki/Optimistic_concurrency_control。您爲您的實體添加version屬性(和列)。每次發生更新時,都會增加一次。事實上update語句的樣子:

update ... set version=6 ... where id=? and version=5; 

如果從上面pseudoquery查詢受影響的行是0,那麼別人設法先更新實體。你做什麼取決於你。請注意,您需要將實體的html更新表單上的版本作爲隱藏參數呈現,並在每次更新時將其發送回服務器。在退貨時,你必須寫回更新的版本。

通常第一次增強就足夠了。如果許多人同時編輯相同的實體,第二個將改進系統。它解決了「丟失的更新」問題。

1

我會在客戶端實現一個隊列,並鏈接成功的請求或回滾失敗的請求。

您需要定義「不成功」,無論是超時還是返回值。