ImmutableJS和Redux可通过RXJS 6.x观察到

时间:2018-07-25 21:40:05

标签: redux rxjs immutable.js redux-observable rxjs6

我有一个现有项目,该项目将ImmutableJS用于状态,Redux Observable中间件和RXJS5.x。我注意到使用RXJS 6.x的Redux Observable的最新版本具有与以前不同的依赖项注入模式。具体来说,商店注入已被“ state $”流代替。我的问题是我可以将RXJS 6.x与ImmutableJS一起使用吗?我是否会将“ state $”视为普通的固定对象,并使用“ state $ .get('username')”之类的东西?

1 个答案:

答案 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)
      ),
    )
  ),
)