我有一个现有项目,该项目将ImmutableJS用于状态,Redux Observable中间件和RXJS5.x。我注意到使用RXJS 6.x的Redux Observable的最新版本具有与以前不同的依赖项注入模式。具体来说,商店注入已被“ state $”流代替。我的问题是我可以将RXJS 6.x与ImmutableJS一起使用吗?我是否会将“ state $”视为普通的固定对象,并使用“ state $ .get('username')”之类的东西?
答案 0 :(得分:0)
您不再通过调用store.getState()
来获得状态。相反,您订阅state$
流以在发生更改时接收更改。发出的事件将只是您通过调用store.getState()
获得的值。如果那是一个ImmutableJS对象,那么您将得到。在使用ImmutableJS对象与使用标准对象的情况下,此更改几乎没有意义。
有多种方法来利用新的state$
流,如何完成某事的具体细节取决于您的用例。 state$
流的真正精巧之处在于,史诗可以对状态变化做出反应,而不必采取行动将其拉开序幕。
假设您要在操作发生时获取/使用该状态的最新版本。您可以简单地使用withLatestFrom
运算符:
const epic = (action$, state$) => action$.pipe(
ofType(ACTION_TYPE),
withLatestFrom(state$),
mergeMap(([action, state]) => ...),
)
这或多或少是store.getState()
的替代品。对于每个匹配动作,将传递该时间的当前状态。 withLatestFrom
之后的下一个运算符将接收一个数组(或“元组”),该数组具有在索引0处发生的操作和在索引1处的当前状态。
在此基础上,您可能希望在实施更大的工作流程时多次使用state$
:
const epic = (action$, state$) => action$.pipe(
ofType(LOAD_PROFILE),
withLatestFrom(state$),
switchMap(([action, state]) =>
concat(
merge(
state.get('profile') === undefined
? ajax.getJSON(...).pipe(...) // emit some action(s)
: empty(),
state.get('friendList') === undefined
? ajax.getJSON(...).pipe(...) // emit some action(s)
: empty(),
),
state$.pipe( // get a fresh, updated copy of state
first(),
map(state => [state, state.get('profile')]),
filter(([state, profile]) => profile.get('hasStars') && state.get('stars') === undefined),
mergeMap(() => ajax.getJSON(...).pipe(...)), // emit some action(s)
),
)
),
)