这是一个来自easy easy文档的示例代码,但是同样的问题也适用于redux-toolkit中的createThunk:
function MyComponent() {
const saveTodo = useStoreActions(actions => actions.todos.saveTodo);
const onSaveClick = useCallback(
// We chain on the promise returned by dispatching the thunk
// 👇
() => saveTodo('Learn easy peasy').then(() => {
// redirect on success
history.push('/done');
}),
[saveTodo]
);
}
- 让我们说saveTodo在存储中保存待办事项(更改存储)。更改存储将触发订阅组件的重新呈现。那么,"然后"是怎么做到的呢?逻辑执行吗?
- 假设保存todo不会立即重新呈现组件,而是在执行&;then&;中的逻辑之后。如果我想在保存待办事项时显示加载旋转器,然后执行history.push…,该怎么办?
顺序为:
- 组件调用
saveTodo()
- 我假设
saveTodo
函数已经包装了对dispatch
的实际调用,因此在内部运行dispatch(actualSaveTodoThunkActionCreator())
。这将创建一个新的"think函数"。并传递给dispatch
。 - 中间件看到"动作";实际上是一个笨重的函数,阻止它继续前进,并调用它:https://redux.js.org/usage/writing-logic-thunks#how-does-the-middleware-work
- 坦克的主体运行,并返回一个Promise
- 中间件返回承诺。
- 返回的Promise通过任何其他中间件传递回来,最后从原始
dispatch()
调用返回 useCallback()
中的代码获得Promise,并在其上链一个.then()
调用- 正常的承诺解决发生在未来的某个时刻。
- Promise被解析后,内部调用
.then()
回调。
对于第二个问题,您可以在分派之前和分派之后在组件中设置加载状态:
https://redux.js.org/tutorials/essentials/part-5-async-logic checking-thunk-results-in-components