javascript - 渲染时按顺序敲击
问题描述
我有一个应用程序可以在渲染时获取一些用户信息。因此,当应用程序首次启动时,它使用 getUserInformation() 函数获取数据。用户无需手动登录,应用在公司内网。
export function getUserInformation() {
return function (dispatch) {
getUser()
.then((data) => {
dispatch(
{type: GET_USER_SUCCESS, response: data}
)
})
.catch((error) => {
dispatch(
{type: GET_USER_FAILURE, response: error}
)
})
}
}
现在我想获取整个应用程序中可用的应用程序版本。但是只有在用户登录后才能触发 API 调用(因此成功调用了 getUser())。我应该添加
.then(getVersion())
在 getUserInformation() 操作中?它看起来并不干净,但我不知道如何以不同的方式处理它。
解决方案
动作创建者是按顺序调度动作的合适位置。该文档涵盖了这一点:
使用像 Redux Thunk 这样的异步中间件当然可以实现诸如连续调度多个不同但相关的动作、调度动作以表示 AJAX 请求的进展、基于状态有条件地调度动作,甚至调度动作并立即检查更新状态等场景然后。
如果用户信息和版本动作需要单独测试(它们应该位于不同的模块中)或单独使用,可以组合动作创建者。这需要返回承诺以链接它们。这也显示了以下限制redux-thunk
:
function getUserInformation() {
return async (dispatch) => {
try {
dispatch(
{type: GET_USER_SUCCESS, response: await getUser()}
)
} catch (error) {
dispatch(
{type: GET_USER_FAILURE, response: error}
)
}
};
}
...
function getVersion() {
return async (dispatch) => {...};
}
...
function getInitialData() {
return async (dispatch, getState) => {
await getUserInformation()(dispatch);
// we need to use getState to check if there was an error
// because getUserInformation returns a fulfilled promise any way
await getVersion()(dispatch);
};
}
从 重新抛出一个错误是有意义的getUserInformation
,但如果它单独使用它会很糟糕,getInitialData
因为这会导致未处理的拒绝。另一种方法更糟糕的是,检查getState()
.
redux-thunk
这种情况需要一个比非常简单的中间件更复杂的中间件——可能是一个基于它并且能够处理拒绝的自定义中间件。
推荐阅读
- angular - Angular Jest 模拟订阅内容
- api - Flask:@app.errorhandler(500) 和 @app.errorhandler(exception) 之间的区别
- python - 将 JSON 解析为 CSV + 附加列
- r - 字符串匹配,用于在遇到特定单词模式时对评论进行分类
- webpack - 实现 webpack 别名后无法加载解析器“javascript”
- amazon-s3 - 对 S3 存储桶中所有对象的 IAM 访问权限
- microsoft-graph-api - 使用 uploadcreatesession onedrive 上传大文件
- python - 如何在点云中分割与rgb图像上的对象像素相对应的一些对象
- amazon-web-services - 有没有办法自定义 Elastic Beanstalk 创建的 EC2 实例的名称?
- android - Firebase Testlab 忽略 testInstrumentationRunnerArgument