angular - NGRX - Spustiť funkciu po každom efekte


Je možné mať určitý druh 'callback funkcie' alebo sledovača pre NGRX Effect? Prípad použitia je, že sa snažím uchovať stav pri obnove prehliadača. Chcel by som zavolať svoju cache službu na uloženie stavu aplikácie po spustení každého efektu. Momentálne to robím tak, že toto pridávam ku každému efektu:

tap(() => setTimeout(() => this.cacheService.saveAppState()))

Zdá sa, že by mal existovať lepší spôsob, ako to dosiahnuť?

Odpoveď č. 1

Áno, existuje lepší spôsob. Môžete implementovať OnRunEffects na triedach efektov. Napríklad:

@Injectable()
export class OrderStoreEffects implements OnRunEffects {
  // Resolves to either QueryCompleted or QueryFailed
  @Effect()
  queryOrdersFromProduct$: Observable<Action> = this.actions$.pipe(...);

  // Resolves to either QueryCompleted or QueryFailed
  @Effect()
  queryOrdersFromWorkCenter$: Observable<Action> = this.actions$.pipe(...);

  constructor(...) {}

  ngrxOnRunEffects(resolvedEffects$: Observable<EffectNotification>) {
    return resolvedEffects$.pipe(tap(effect => console.log({ effect })));
  }
}

Observabilný objekt resolvedEffects$ emituje pri každom vykonaní a vyriešení efektu v triede OrderStoreEffects.

Vypustené hodnoty vyzerajú takto:

Čo vám poskytuje ďalšie možnosti aplikovať filtre alebo inú logiku.

Pre viac informácií o rozhraní OnRunEffects si pozrite dokumentáciu

Odpoveď č. 2

nepotrebuješ nič špeciálne. Napíš samostatný efekt s funkciou, ktorú si ukázal, a jednoducho v ňom nefiltrovať typ akcie, ale choď priamo:

this.$actions.pipe(/* your logic here */)

takže to bude fungovať pre všetky akcie.

teraz môžete mať withLatestFrom, aby ste získali aktuálny stav a robili s ním čokoľvek, čo potrebujete.

[AKTUALIZÁCIA]

Toto by som nerealizoval v efektoch, ale v canDeactivate strážach routera.

Súvisiace články