2017-05-08 17 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等)。

参考
相关问题