javascript - 如何在两种情况下有效地调用 setState - 成功和错误?
问题描述
我正在使用react
并且我有一个异步操作,它使用axios
. 我还有一个标志(状态变量tableLoaded
),它描述是否获取数据。
this.props.fetchDataAction(requestParams).then(
() => {
this.setState({
data: this.props.reports.data
});
}
).then(() => {
this.setState({ tableLoaded: true })
});
我希望我的标志tableLoaded
在这两种情况下都设置为 true - 在 API 调用成功和失败之后,所以我只是then()
在我的 Promise 上添加了另一个,它触发了将此标志设置为 true 的函数。
我的问题是 - 这是实现我的目标的最佳解决方案吗?或者我应该在这两种情况下重复这个代码?
解决方案
您应该使用Promise.finally语法。
this.props.fetchDataAction(requestParams)
.then(() => {
// Do your thing on success
this.setState({
data: this.props.reports.data
});
})
.catch((error) => {
// Do something if failed
})
.finally(() => {
// Do this in all cases..
this.setState({ tableLoaded: true })
});
编辑:
如果 return fromfetchDataAction
是 Axios 承诺,那么您应该替换.finally
为,.then
因为 Axios 不提供该finally
方法。然后我会说你原来的建议是正确的。你可以评论第二个.then
,这样你就知道为什么了。
this.props.fetchDataAction(requestParams)
.then(() => {
// Do your thing on success
this.setState({
data: this.props.reports.data
});
})
.catch((error) => {
// Do something if failed
})
.then(() => { // Triggered in all cases by axios
// Do this in all cases..
this.setState({ tableLoaded: true })
});
推荐阅读
- ios - 架构 x86_64 clang 的 PaymentSDK':错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- laravel - 如何在 laravel 中为每个用户设置动态权限授予
- python - 如何从左到右运行非贪婪的正则表达式
- android - 转换单
转为布尔 (Kotlin) - python - 如何使用for循环在python中附加一个列表
- r - 使用 gsub 从 R 中的数据集中删除主题标签、超链接和 twitter 句柄
- php - 在标签外渲染的表单元素
- c - Windows gcc 上 srand() 的输出与 C 编程的预期输出的差异?
- angular - 如何在 TypeScript 3 中获取字符串值时从第二个索引迭代枚举?
- css - 关于重复(后备)属性,如何评估 CSS 规则?