2016-08-01 103 views
0

嗨,我是新來的反應/ Redux的發展環境,讓我明白任何幫助。承諾解決所有內部承諾解決之前,多個異步API調用

我試圖讓2 API調用我的app.js dispatch(fetchAllPositions(selectedUserDivision))當異步調用componentDidMount

我發現了一個建議的方法在this postfetchAllPositions功能在Promise.all

包裝兩項行動功能整合在一起
export function fetchAllPositions(division) { 
    return dispatch => Promise.all([ 
     dispatch(fetchUserPositionsIfNeeded(division)), 
     dispatch(fetchDefaultPositionsIfNeeded(division)) 
    ]) 
    .then(console.log("fetched both")) 
} 

兩個動作功能幾乎是一樣的,他們只需要調用一個稍微不同的API網址。其中一個看起來像如下,其中shouldFetchUserPosition只是一個純函數返回一個布爾值:

function fetchUserPositions(division) { 
    return dispatch => { 
     const url = apiOptions.server + `/api/user/position?division=${division}` 
     dispatch(requestUserPositions(division)) 
    return fetch(url, options) 
     .then(response => response.json()) 
     .then(json => dispatch(receiveUserPositions(division,json)), 
     err => console.log(err)) 

    } 
} 

export function fetchUserPositionsIfNeeded(division) { 
    return (dispatch, getState) => { 
    if (shouldFetchUserPositions(getState(), division)) { 
     return dispatch(fetchUserPositions(division)) 
    } else { 
     return Promise.resolve() 
    } 
    } 
} 

的邏輯是對的更新,同時拉動數據REQUEST...動作被髮送,那麼RECEIVE...動作當數據準備好更新到新狀態時發送。

麻煩的是,Promise.all應該等待REQUEST1REQUEST2RECEIVE1RECEIVE2所有做.then(console.log("fetched both"))

眼下之前進來,它確實在.then後第2 REQUEST完成後,不會等待2 RECEIVE到進來了。

enter image description here

我懷疑它是requestUserPositions()的嵌套性質它包裝fetch()

REQUEST動作是一個簡單的功能,而在減速它只是翻轉功能內的isFetching屬性true

function requestUserPositions(division) { 
    return { 
    type: REQUEST_USER_POSITIONS, 
    division 
    } 
} 

對不起這麼久的問題,但我會很感激的任何建議。

回答

-1

這是無心之失

原來,當.then()被包裹調度內爲Promise.all()正在緊張進行中它被同時執行。

預期的調度命令被標註的then(()=>console.logComponentDidMount

做最後的調度 dispatch(fetchAllPositions(selectedUserDivision))創建