2017-02-06 100 views
0

我希望我的應用程序知道異步操作何時被觸發以及何時完成。原因是我希望我的應用程序的整體狀態爲loading,當所有的異步操作都完成時它將設置爲true。早期實施這個過程使用全球計數器進行回調。Redux Thunk操作和共享狀態

這些操作可能位於不同的文件中,並且可能由單獨的減速器監聽,負責不同的狀態分支。

我使用thunk-middleware用我的行動異步如此redux-promise-middleware一個組合可能是這樣的:

export const requestSiteData =() => (dispatch, getState, api) => { 
    const url = '/endpoint'; 

    return dispatch({ 
    type: 'STATE_BRANCH/REQUEST_SOME_DATA', 
    payload: api.fetch(url) 
    }).catch(() => {}); 
}; 

這則派遣STATE_BRANCH/REQUEST_SOME_DATA_FULFILLEDSTATE_BRANCH/REQUEST_SOME_DATA_REJECTED時完成。

由於承諾中間件,我發現很難攔截該調用並計算/確定有多少個Ajax請求已完成,有多少已完成,因爲這些操作是預先確定的,我無法調度其他操作從我的減速器。

我可以在那裏更新狀態,但異步操作可能會跨狀態樹的幾個部分分開,所以我沒有一個整體位置來管理請求。

有沒有人有任何想法,我可能會去解決這類問題。如果描述/用例不清楚,請大聲呼喊。

+0

你可以使用'''終極版middleware'''這個? http://redux.js.org/docs/advanced/Middleware.html –

+1

他已經在爲此使用redux中間件。 redux-thunk和redux-promise都是中間件。 – therewillbecode

回答

-2

甲thunk是的功能鏈,其執行逐個所以在你的情況下,你對異步調用代碼應該是

export function asyncAction() { 
    return function(dispatch){ 
     fetchCall().then((data)=>data.json()) 
      .then((data)=>disptach(handleAsyncDataAction(data)) 
    } 

和fetchCall()函數應寫爲。

function fetchCall(){ 
    return fetch('your_url'); 
} 

和你handleAsyncData(數據)的行動將結果返回給減速器所以在最後一個取叫你寫3種方法。

1.功能,您將組件

export function asyncAction(){..} 

2.誰將會書面承諾,這個功能

function fetchCall(){...} 

和最後一個函數將返回功能調用處理返回數據併發送給Reducer。

function handleAsyncData(data){....} 
+0

這不是我要求的傢伙,謝謝你的嘗試 – dougajmcdonald

0

有根據各地redux-promise一個終極版的中間件,這將幫助你保持未決操作的軌跡:

redux-pending

+0

這看起來很有前途,與我現有的設置類似。我很高興自己跟蹤行動和決議,但想知道是否有一個明智的方法將未決行動列表推入共享狀態。我會玩。 – dougajmcdonald