为什么需要将redux-thunks绑定到发送?

时间:2017-05-08 21:53:44

标签: javascript reactjs redux redux-thunk

我想我在这里错过了一个基本的理解。我知道为了创建一个动作并因此引发redux事件链,必须使用dispatch调用动作创建者。

但是,当我们有一个redux-thunk返回一个函数,它会在我们的动作创建器上调用dispatch时,为什么还必须使用dispatch调用redux-thunk?

例如,请使用以下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。任何人都可以澄清我在这里失踪的东西吗?

1 个答案:

答案 0 :(得分:2)

所有redux中间件都遵循相同的总体布局:

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

  

为什么还必须使用dispatch调用redux-thunk?

就像你在第一段中正确指出的那样,对于要由redux中间件链评估的动作/ thunk,它必须由调用代码dispatch编辑。

我认为误解就在这里:

  

“...当我们有一个redux-thunk返回一个将要执行的函数时   致电我们的行动创造者......“。

虽然返回的函数调度动作是正确的,但它只是故事的一半。从技术上讲,您要发送两次:第一个savePerson和更晚addPersonSuccess。前者是一个笨蛋,后者很可能是一个简单的行动。

现在,让我们考虑当前的redux-thunk source 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等)。

参考