NgRx berhenti berlangganan dari toko di efek

Saya memiliki efek sederhana:

@Effect()
simpleEffect = this.actions.pipe(
  ofType<ActionA>('Action A'),
  withLatestFrom(this.store.select(selectSomething)),
  map(([action, something]) => console.log('CALLED TWICE'))
);

Ini pemilihnya:

export const selectSomething = createSelector(
  (appState) => appState.someState,
  (someState) => someState.something
)

Berikut ini adalah peredam sederhana yang memperbarui nilai something:


export const someReducer = (state: SomeState = someInitialState, action: ActionB) => {
  switch (action.type) {
    case 'Action B':
      return {
        ...state,
        something: action.payload
      };
    default:
      return state;
  }
};

Masalah:

Saat saya mengirimkan ActionB, efek untuk ActionA dipanggil, meskipun sebenarnya tidak.

Seperti yang saya ketahui, ini terjadi karena efek withLatestFrom(this.store.select(selectSomething)), yang mengamati setiap perubahan something SELAMANYA.

Pertanyaan:

Apakah mungkin untuk berhenti berlangganan dari pemilih itu? Atau ada fungsi lain selain withLatestFrom?


person Vlad Yurevich    schedule 09.11.2020    source sumber


Jawaban (2)


Masalahnya bukan pada kode yang Anda tunjukkan, karena withLatestFrom hanya memancarkan satu peristiwa. Instal Redux DevTools untuk melihat tindakan apa yang Anda kirimkan dan lihat apakah Anda mengirimkannya tidak mengirim 'Aksi A' dua kali

person Chris    schedule 09.11.2020
comment
Terima kasih atas jawaban anda! - person Vlad Yurevich; 10.11.2020

Masalahnya serupa tetapi tidak sama.

Sejujurnya, saya punya efek lain untuk ActionC:

@Effect
otherEffect = this.actions.pipe(
  ofType<ActionC>('Action C'),
  switchMap(() => this.store.select(selectSomethingElse)),
  switchMap(() => of(new ActionA()))
)

Dan itu dipanggil ketika somethingElse telah diubah.

Saya tidak sengaja mengirimkan ActionA, tetapi simpleEffect dipicu oleh otherEffect yang berlangganan pada selectSomethingElse

person Vlad Yurevich    schedule 10.11.2020