我有一个 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 中的值(noteAction 和 sessionAction)将代表可观察数据的普通对象,但看起来可观察数据本身正在传递到生成函数中。
如果我控制台记录 sessionAction.payload 的值,我会得到 Observable {_subscribe: ƒ} 而不是普通对象 {...}
我正在寻找有关如何获取由 switchMap 函数中的可观察对象表示的普通对象的方向。
如果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