我們有一個取得對象異步的動作,我們稱之爲getPostDetails
,它需要一個參數,以便通過 獲取一個id。用戶會看到一個帖子列表,點擊其中一個可以獲得一些細節。如何在使用Redux獲取數據時避免競爭條件?
如果用戶點擊「Post#1」,我們會發送一個GET_POST
動作,看起來像這樣。
const getPostDetails = (id) => ({
type: c.GET_POST_DETAILS,
promise: (http) => http.get(`http://example.com/posts/#${id}`),
returnKey: 'facebookData'
})
這是通過一箇中間件,它增加了成功處理程序的承諾,這將調用像 GET_POST__OK
動作與反序列化JSON對象回升。減速器查看該對象並將其應用於商店。一個典型的 __OK
減速機看起來像這樣。
[c.GET_ALL__OK]: (state, response) => assign(state, {
currentPost: response.postDetails
})
後來下了線,我們有一個看起來在currentPost
,並顯示當前職位的細節部分。
但是,我們有一個競賽條件。如果用戶一個接一個地提交兩個GET_POST_DETAILS
動作,則不能保證我們在什麼順序下接收到__OK
動作,如果第二個http請求在第一個http請求之前完成,則 狀態將變得不正確。
Action => Result
---------------------------------------------------------------------------------
|T| User Clicks Post #1 => GET_POST for #1 dispatched => Http Request #1 pending
|i| User Clicks Post #2 => GET_POST for #2 dispatched => Http Request #2 pending
|m| Http Request #2 Resolves => Results for #2 added to state
|e| Http Request #1 Resolves => Results for #1 added to state
V
我們如何確保用戶點擊的最後一項始終優先?
我有一點不同的情況。我應該怎麼做,如果我也有'currentPostId'和'postById',但我必須在時間(創建時間,預覽圖片,元等等)獲取有關所有帖子的數據,然後獲取僅一個選定帖子的內容,在'postById'中緩存與這篇文章有關的所有內容? – denysdovhan
@DanAbramov嗨,我知道這是一個相當古老的問題,但由於任何動作創建者都無法訪問狀態,動作創建者如何判斷它是否被緩存或需要獲取遠程對象? – Vinz243
如果你有'currentListOfSearchResults'這是一個數組,而不是一個'currentPost'?我通常最終會跳過Redux獲取這些結果,並將它們置於本地頁面組件的狀態。 –