使用RXJS 6.x可以观察到ImmutableJS和Redux

使用RXJS 6.x可以观察到ImmutableJS和Redux,redux,rxjs,immutable.js,redux-observable,rxjs6,Redux,Rxjs,Immutable.js,Redux Observable,Rxjs6,我有一个使用ImmutableJS for state、Redux可观察中间件和RXJS 5.x的现有项目。我注意到使用RXJS 6.x的最新版本Redux Observable具有与以前不同的依赖注入模式。具体来说,存储注入已被“state$”流替换。我的问题是,我可以将RXJS 6.x与ImmutableJS一起使用吗?我是否会将“state$”视为一个普通的不可变对象,并使用类似“state$.get('username')”的东西?您不再通过调用store.getState()来获取状态

我有一个使用ImmutableJS for state、Redux可观察中间件和RXJS 5.x的现有项目。我注意到使用RXJS 6.x的最新版本Redux Observable具有与以前不同的依赖注入模式。具体来说,存储注入已被“state$”流替换。我的问题是,我可以将RXJS 6.x与ImmutableJS一起使用吗?我是否会将“state$”视为一个普通的不可变对象,并使用类似“state$.get('username')”的东西?

您不再通过调用
store.getState()
来获取状态。相反,您可以订阅
状态$
流,以便在发生更改时接收更改。发出的事件将只是通过调用
store.getState()
获得的值。如果这是一个ImmutableJS对象,那么您将得到它。与标准对象相比,在使用ImmutableJS对象的情况下,这一变化意义不大

有多种方法可以利用新的
状态$
流,关于如何完成某些事情的细节将取决于您的用例。
state$
流真正巧妙的地方在于,epics可以对状态变化做出反应,而不必采取行动启动

假设您希望在操作发生时获取/使用状态的最新版本。您只需使用
with latestfrom
操作符:

const epic=(action$,state$)=>action$.pipe(
OF类型(动作类型),
withLatestFrom(州$),
合并映射(([action,state])=>…),
)
这或多或少取代了
store.getState()
。对于每个匹配操作,将传递该时刻的当前状态。
withLatestFrom
之后的下一个操作符将接收一个数组(或“元组”),其中的操作发生在索引0,当前状态发生在索引1

在此基础上,在实施更大的工作流时,您可能希望多次使用可观察的
状态$

const epic=(action$,state$)=>action$.pipe(
OF类型(荷载剖面图),
withLatestFrom(州$),
开关映射(([操作,状态])=>
海螺(
合并(
state.get('profile')==未定义
?ajax.getJSON(…).pipe(…)//发出一些操作
:empty(),
state.get('friendList')==未定义
?ajax.getJSON(…).pipe(…)//发出一些操作
:empty(),
),
state$.pipe(//获取状态的新的、更新的副本
第一个(),
映射(state=>[state,state.get('profile')]),
过滤器(([state,profile])=>profile.get('hasStars')&&state.get('stars')==未定义),
mergeMap(()=>ajax.getJSON(…).pipe(…),//发出一些操作
),
)
),
)