rxjs 流中的沉浸式生成无法对对象进行操作

问题描述 投票:0回答:1

我有一个 rxjs 流,我想用 immer 的产品修改流中移动的数据。

我组合了一个动作类型的两个可观察量:

Action 是一种对象, 代表一个事件。它具有类型属性和有效负载属性。

对于上下文,我使用 state-adapt 进行状态管理,这就是操作类型的来源

所以我声明了以下流:

  private addNoteRowToSessionSegmentEffect$ = combineLatest([
    this.segmentStateChangeAction$,
    this.setActiveSessionAction$,
  ]).pipe(
    filter(
      ([noteAction]) =>
      noteAction.payload.action === cellActionsEnum.Enum["TOGGLE-NOTE"]
    ),
    switchMap(([noteAction, sessionAction]) => {
      console.log('session type', typeof sessionAction.payload) // logs 'session type object'
      console.log('session', sessionAction.payload) // logs 'Observable {_subscribe: ƒ}'
      return of(
        produce(sessionAction.payload, draftSession => {
          draftSession.title = noteAction.payload.action;
        })
      );
    }),
    toSource("[FEAT SESSION] add note effect")
  );

问题是我收到以下错误:

未捕获的错误:[Immer] 只能在 可起草:已标记的普通对象、数组、Map、Set 或类 与“[沉浸式]:真实”。得到“[对象对象]”

immer Produce 适用于普通对象,但不适用于可观察对象。我认为 switchMap 中的值(noteActionsessionAction)将代表可观察数据的普通对象,但看起来可观察数据本身正在传递到生成函数中。

如果我控制台记录 sessionAction.payload 的值,我会得到 Observable {_subscribe: ƒ} 而不是普通对象 {...}

我正在寻找有关如何获取由 switchMap 函数中的可观察对象表示的普通对象的方向。

javascript rxjs immer.js
1个回答
0
投票

如果sectionAction有效负载实际上是一个可观察的,那么您需要将其解包。像这样的东西应该有效:

private addNoteRowToSessionSegmentEffect$ = combineLatest([
  this.segmentStateChangeAction$,
  this.setActiveSessionAction$,
]).pipe(
  filter(([noteAction]) => noteAction.payload.action === cellActionsEnum.Enum["TOGGLE-NOTE"]),
  switchMap(([noteAction, sessionAction]) => sessionAction.payload.pipe(
    map(sessionActionPayload => produce(sessionActionPayload, draftSession => {
      draftSession.title = noteAction.payload.action;
    }))
  )),
  toSource("[FEAT SESSION] add note effect")
);

这是一个StackBlitz

© www.soinside.com 2019 - 2024. All rights reserved.