为啥我使用有效的 withLatestFrom 操作从选择器获取具有动作观察者属性的对象?

Posted

技术标签:

【中文标题】为啥我使用有效的 withLatestFrom 操作从选择器获取具有动作观察者属性的对象?【英文标题】:Why Am I getting an object with action observer property from selector using withLatestFrom operation in effect?为什么我使用有效的 withLatestFrom 操作从选择器获取具有动作观察者属性的对象? 【发布时间】:2022-01-06 14:10:10 【问题描述】:

“res”值是一个对象,即不是检索与选择器相关的数据,是在其他地方工作,但实际上是获取这个对象。为什么会这样?

constructor(
      private serviceStore: Store<DataState>,
) 

  searchForLatest$ = createEffect(() =>
      this._actions.pipe(
          ofType<GetLatestRequestService>(GetLatestData),
          withLatestFrom(( id ) => 
             this.serviceStore.select(getlatestData(id)),
          mergeMap(res => 
              


 actionsObserver:  
      closed: false,
      hasError: false,
      isStopped: false,
      observers: [SkipSubscriber],
      thrownError: null,
      _isScalar: false,

operator: 
      compare: undefined
      keySelector: undefined

reducerManager: 
      closed: false
      dispatcher: DevtoolsDispatcher _isScalar: false, observers: Array(1), closed: false, 
      isStopped: false, hasError: false, …
      hasError: false
      initialState: undefined
      isStopped: false
      observers: [MapSubscriber]
      reducerFactory: (reducers, initialState) => …
      reducers: uiContext: ƒ, parties: ƒ, user: ƒ, organizationsDetail: ƒ, activeRoute: ƒ, …
      thrownError: null
      _isScalar: false
      _value: (state, action) =>

Source: 
     actionsObserver: ActionsSubject _isScalar: false, observers: Array(1), closed: false, 
     isStopped: false, hasError: false, …
     operator: MapOperator thisArg: undefined, project: ƒ
     reducerManager: ReducerManager _isScalar: false, observers: Array(1), closed: false, 
     isStopped: false, hasError: false, …
     source: Store _isScalar: false, actionsObserver: ActionsSubject, reducerManager: 
     ReducerManager, source: Observable
     _isScalar: false

_isScalar: 假

【问题讨论】:

看来你没有正确应用 withLatestFrom 应该与像 withLatestFrom(anObservable$) 这样的可观察对象一起使用。重新表述你的要求,你想要达到的目标是什么? 这是一个可观察的 this.serviceStore.select(getlatestData(id)),我需要从该选择器中检索最新数据,问题是之前方法中的操作符实际上 withLatestFrom 就足够了从存储中获取数据。 【参考方案1】:

v13 中的效果更新了从选择器中检索最新数据的方法,我需要使用 concatLatestFrom 运算符来获取数据。

@Injectable()
export class CollectionEffects 
  addBookToCollectionSuccess$ = createEffect(
    () =>
      this.actions$.pipe(
        ofType(CollectionApiActions.addBookSuccess),
        concatLatestFrom(action => this.store.select(fromBooks.getCollectionBookIds)),
        tap(([action, bookCollection]) => 
          if (bookCollection.length === 1) 
            window.alert('Congrats on adding your first book!');
           else 
            window.alert('You have added book number ' + bookCollection.length);
          
        )
      ),
     dispatch: false 
   );

  constructor(
    private actions$: Actions,
    private store: Store<fromBooks.State>
  ) 

注意:出于性能原因,请使用 concatLatestFrom 之类的扁平化运算符来防止选择器触发,直到调度正确的操作。

【讨论】:

以上是关于为啥我使用有效的 withLatestFrom 操作从选择器获取具有动作观察者属性的对象?的主要内容,如果未能解决你的问题,请参考以下文章

#私藏项目实操分享# RxJs 操作符 withLatestFrom 在 SAP 电商云 Spartacus UI 中的应用

将ngrx效果与withLatestFrom运算符一起使用时的奇怪行为

将参数传递给 withLatestFrom 函数

RxSwift 简单 withLatestFrom 不触发

RxJs操作符,其行为类似于withLatestFrom,但会等待第二个流的值。

如何从 rxjs 6 withLatestFrom 键入数组映射参数