首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在组件中订阅epic的动作输出流

如何在组件中订阅epic的动作输出流
EN

Stack Overflow用户
提问于 2018-08-16 22:45:35
回答 1查看 660关注 0票数 1

我正在将loadInstruments thunk重构为redux-observable epic,因为它做了越来越多的异步操作,加上我需要取消操作等(教程中的典型维基搜索场景)。

这就是我的组件如何使用这个thunk (它是通过mapDispatchToProps提供的)

代码语言:javascript
复制
this.props.loadInstruments(queryParams).then(...)

Thunk做了很多事情,其中之一就是AJAX调用。它返回了一个承诺,我可以等待,然后看看AJAX调用的结果(这个结果也被放到redux store中)。

然而,在重构到redux-observable和epic之后,我没有办法从epic返回一个值,因为我的loadInstruments看起来像这样(它只是调度和操作,而epic的ofType正在过滤):

代码语言:javascript
复制
const loadInstruments = ({ type: 'LAUNCH_LOAD_INSTRUMENTS_EPIC' })

LAUNCH_LOAD_INSTRUMENTS_EPICofType捕获时,它使用rxjs魔术运行,一旦加载了工具(AJAX调用),它们就会存储在存储中(通过使用switchMap并调度更新存储的新操作)。

但我的组件使用loadInstruments返回的Promise settled值来快速获取获取/放入存储的内容。在重构为epic之后,我不知道如何从loadInstument获取/返回值。

有没有办法用redux-observable实现类似的东西,或者我需要重构我的组件?例如。

代码语言:javascript
复制
loadInstruments(queryParams).subscribe(x => ...)
EN

回答 1

Stack Overflow用户

发布于 2018-08-16 23:53:15

我不再太熟悉redux-thunk了,但如果我理解正确的话,之前的thunk是更新组件状态或应用程序(redux)状态。当您重构以使用redux-observable时,您将不再获得组件的更新值。

这听起来像是你只需要使用redux connect(mapState, mapDispatch)在你的组件中订阅状态变化在这个场景中,mapDispatch将包装loadInstruments,我相信你已经在工作了,mapState将订阅你在从epic中发送一个动作后更新的状态片段。您只需要确保您的epics "out“操作包括用于更新redux状态的数据,并且您还订阅了组件中的状态更改。例如

代码语言:javascript
复制
const myEpic = (action$) => 
action$.pipe(
  ofType(LAUNCH_LOAD_INSTRUMENTS_EPIC),
  /* ajax operators and whatever else*/
  mapTo({ type: OUT_ACTION_WITH_NEW_STATE instruments: {/*new state*/} })
)

/*reducer land...*/
if (action.type === OUT_ACTION_WITH_NEW_STATE) {
  return {...prevState, instruments: action.instruments}
}

/*component land*/
connect((state) => {instruments: state.instruments}, {loadInstruments})(myComponent)

引用你问题的标题"subscribe To epic's output stream of action in a component",你不需要,订阅发生在redux-observable中间件中。因此,您永远不需要手动将subscribe()调用添加到流的末尾。使用redux-observable,操作流是:

调度操作-> reducer -> epic ->操作-> reducer -> epic ->操作...(重复)如果任何组件订阅了带有connect的redux存储,则当存储更新时,该组件将接收到作为prop的更新状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51879796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档