我正在将loadInstruments thunk重构为redux-observable epic,因为它做了越来越多的异步操作,加上我需要取消操作等(教程中的典型维基搜索场景)。
这就是我的组件如何使用这个thunk (它是通过mapDispatchToProps提供的)
this.props.loadInstruments(queryParams).then(...)Thunk做了很多事情,其中之一就是AJAX调用。它返回了一个承诺,我可以等待,然后看看AJAX调用的结果(这个结果也被放到redux store中)。
然而,在重构到redux-observable和epic之后,我没有办法从epic返回一个值,因为我的loadInstruments看起来像这样(它只是调度和操作,而epic的ofType正在过滤):
const loadInstruments = ({ type: 'LAUNCH_LOAD_INSTRUMENTS_EPIC' })当LAUNCH_LOAD_INSTRUMENTS_EPIC被ofType捕获时,它使用rxjs魔术运行,一旦加载了工具(AJAX调用),它们就会存储在存储中(通过使用switchMap并调度更新存储的新操作)。
但我的组件使用loadInstruments返回的Promise settled值来快速获取获取/放入存储的内容。在重构为epic之后,我不知道如何从loadInstument获取/返回值。
有没有办法用redux-observable实现类似的东西,或者我需要重构我的组件?例如。
loadInstruments(queryParams).subscribe(x => ...)发布于 2018-08-16 23:53:15
我不再太熟悉redux-thunk了,但如果我理解正确的话,之前的thunk是更新组件状态或应用程序(redux)状态。当您重构以使用redux-observable时,您将不再获得组件的更新值。
这听起来像是你只需要使用redux connect(mapState, mapDispatch)在你的组件中订阅状态变化在这个场景中,mapDispatch将包装loadInstruments,我相信你已经在工作了,mapState将订阅你在从epic中发送一个动作后更新的状态片段。您只需要确保您的epics "out“操作包括用于更新redux状态的数据,并且您还订阅了组件中的状态更改。例如
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的更新状态。
https://stackoverflow.com/questions/51879796
复制相似问题