如何在Redux Action的catch块中返回状态值?
如何在Redux Thunk Action的Catch块中返回状态值并让React组件接收
我来帮你梳理下问题的根源,以及对应的解决方案:
问题分析
- Thunk Action缺少
async关键字:你在Action里使用了await DeviceApi.checkTagAssignment,但包裹这段逻辑的dispatch函数没有标记为async,这会直接导致语法错误,异步逻辑无法正确执行,组件自然拿不到返回值。 - 返回值结构不统一:Catch块里你直接返回了单一的
status值(比如TagStatus.NotFound),但组件代码里期望读取result.status——这时候result就是状态值本身,并非对象,所以result.status会是undefined。 - 状态更新逻辑失效:Try块里你直接
return response.result,导致后面的dispatch语句永远不会执行,Redux状态根本没机会更新。
修正后的Action代码
我们需要给Thunk函数加上async,统一返回值结构,同时调整dispatch的位置确保状态能正确更新:
const someAction = (tagId, token) => async dispatch => { // 新增async关键字 // 先触发初始状态变更 dispatch({ type: TagAssignmentActionTypes.TagAssignmentChanged }) let status, assignee, response try { response = await DeviceApi.checkTagAssignment(tagId, token) assignee = response.result.assignee status = response.result.status // 先更新Redux状态,再返回结果 dispatch({ type: TagAssignmentActionTypes.TagAssignmentChanged, status, assignee, response }) // 返回与catch块结构一致的对象,方便组件统一处理 return { status, assignee } } catch (e) { console.log(e, 'eeeeeeee') // 处理404情况,同时可以添加其他错误的默认处理 status = (e && e.status === httpStatusCode.notFound) ? TagStatus.NotFound : TagStatus.Error // 假设有这个错误状态枚举 // 更新Redux的错误状态 dispatch({ type: TagAssignmentActionTypes.TagAssignmentChanged, status }) // 返回包含status的对象,让组件能通过result.status读取 return { status } } }
组件调用的注意事项
你的组件调用代码不需要大改,现在Action返回的无论是成功还是错误结果,都是包含status属性的对象,原来的result.status就能正确获取到状态值了:
lookupComplete = (tagId = this.state.tagId) => this.setState({tagId}, async () => { let person, status let result = await this.props.someAction(parseInt(tagId, 16), this.props.accessToken) console.log(result.status, 'status') // 现在能正确打印状态了 status = result.status person = this.props.persons[result.assignee] person ? this.triggerTransition(transitions.ClickCheckTag, {person, status}) : this.triggerTransition(transitions.Free) })
核心点在于:Thunk Action本质是返回一个函数,只有当这个函数是async时,组件用await才能拿到Promise的最终返回值;同时统一返回值结构,能让组件的错误处理逻辑更一致。
内容的提问来源于stack exchange,提问作者Palaniichuk Dmytro
相关产品推荐
相关产品推荐

