2017-05-08 90 views
2

我想我在這裏錯過了一個基本的理解。我知道,爲了創建一個動作並因此引發事件的重疊鏈,必須使用dispatch來調用動作創建者。爲什麼需要將redux-thunks綁定到dispatch?

然而,當我們有一個終極版,thunk的返回功能,這將要求我們的行動創造者dispatch,爲什麼一定要了Redux-的thunk也可以用dispatch叫什麼名字?

例如採取以下Redux的-的thunk:

function savePerson(person: Person) { 
    return async (dispatch: any) => { 
     delete person.cars; 
     let newPerson = await axios.post('/api/people/addPeron', person); 
     dispatch(addPersonSuccess(person)); 
    } 
} 

調用不帶dispatch這savePerson功能不會掀起了Redux流,我不明白爲什麼考慮它返回的函數調用我們的行動創造者與dispatch。任何人都可以澄清我在這裏所缺少的東西嗎?

+0

認爲這是另一個減速。 –

回答

2

所有終極版中間件遵循相同的總體佈局:

const middleware => store => next => action => next(action);

爲什麼一定要了Redux-的thunk也可以用dispatch叫什麼名字?

就像你在正確的第一段指出,一個動作/咚通過了Redux中間件鏈進行評估,它必須是dispatch版由調用代碼。

我認爲誤解進來這裏:

「......當我們有一個終極版-的thunk它返回一個函數,它都會對我們的行動的創建者 呼叫調度...」。

雖然返回的函數調度一個動作是正確的,但它只是故事的一半。從技術上講,您要派遣兩次:第一個savePerson及以後的addPersonSuccess。前者是一個大塊頭,後者很可能是一個簡單的行爲。

現在,讓我們考慮當前redux-thunksource code

function createThunkMiddleware(extraArgument) { 
    return ({ dispatch, getState }) => next => action => { 
    if (typeof action === 'function') { 
     return action(dispatch, getState, extraArgument); 
    } 

    return next(action); 
    }; 
} 

... 

export default thunk; 

一旦派遣savePerson,中間件識別您的動作作爲一個功能。然後它會注入dispatch作爲第一個參數,以便稍後允許調度其他操作。到目前爲止,dispatch尚未在您的addPersonSuccess操作上調用。只有在您添加一個人的異步呼叫後,纔會在addPersonSuccess上調用派遣。

我喜歡把這個想法看作是在thunk中傳遞redux上下文(dispatch,getState等)。

參考