redux - 我不明白 redux thunk with chaining 的执行流程
问题描述
这是来自easy peasy docs的示例代码,但同样的问题也适用于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 将待办事项保存在商店中(更改商店)。更改存储会触发订阅组件的重新呈现。那么,“then”逻辑是如何执行的呢?
- 假设保存待办事项不会立即重新渲染组件,而是在执行“then”中的逻辑之后。如果我想在保存待办事项的同时显示加载微调器,然后执行“history.push ...”怎么办?
解决方案
顺序是:
- 组件调用
saveTodo()
- 我假设的
saveTodo
函数已经包装了对 的实际调用dispatch
,因此在内部运行dispatch(actualSaveTodoThunkActionCreator())
。这会创建一个新的“thunk 函数”并将其传递给dispatch
. - thunk 中间件看到“动作”实际上是一个 thunk 函数,阻止它继续前进,并调用它:https ://redux.js.org/usage/writing-logic-thunks#how-does-the-middleware -工作
- thunk 的主体运行,并返回一个 Promise
- thunk 中间件返回该 Promise。
- 返回的 Promise 通过任何其他中间件传回,最后从原始
dispatch()
调用返回 - 中的代码
useCallback()
获取 Promise,并.then()
在其上链接调用 - 正常的 Promise 解决方案发生在未来的某个时间点。
- Promise
.then()
在解决后会在内部调用回调。
根据第二个问题,您可以在调度之前和之后在组件中设置加载状态:
https://redux.js.org/tutorials/essentials/part-5-async-logic#checking-thunk-results-in-components
推荐阅读
- excel - 快速启动用户表单
- python - 将列表字典写入python中的制表符分隔文件,字典键值作为没有熊猫的列
- c# - 获取特定 Excel 工作表中的列列表
- linux - 我如何使用 shell 脚本安装跳过或自动输入
- css - IE11中的网格元素重叠
- c++ - 即使使用相同的键,如何进行有效的顺序输入和键状态?
- angular - 找不到模块'@ngmodule/material-carousel'
- javascript - React Native 导入错误:无法使用 .bin 解析模块(如何导入某种类型的文件?)
- c# - 如何将现有枚举作为 WCF 服务参数传递?
- ms-access - MS Access - 将数据标准化为概率分布