Селектор @ngrx, излучающий дважды параллельно - PullRequest
0 голосов
/ 07 сентября 2018

У меня довольно простой селектор

export const isLoading = createSelector(
  state => state.$loading
);

и два действия StartLayoutNavigationAction и EndLayoutNavigationAction, которые просто устанавливают флаг $loading соответственно. Я вызываю эти функции один раз, мои действия записываются в журнал:

ACTION – [Layout] Start navigation StartLayoutNavigationAction {layout: "login", type: "[Layout] Start navigation"}
ACTION – [Layout] End navigation EndLayoutNavigationAction {type: "[Layout] End navigation"}

Таким образом, можно предположить, что селектор сработал бы один раз, когда было вызвано первое действие, и один раз, когда было вызвано второе. Никаких действий между ними.

НО:

Селектор, кажется, излучает дважды параллельно. Я пипец следующим образом:

layoutLoading$: Observable<boolean> = this.store.pipe(
  select(isLoading),
  distinctUntilChanged((x, y) => {
    console.log("Comparison:", x, y);
    return x === y;
  }),
  tap(value => console.log("New val:", value))
);

И это вывод:

ACTION – [Layout] Start navigation StartLayoutNavigationAction {layout: "login", type: "[Layout] Start navigation"}
Comparison:  false true
New val: true
Comparison: false true
New val: true
ACTION – [Layout] End navigation EndLayoutNavigationAction {type: "[Layout] End navigation"}
Comparison: true false
New val: false
Comparison: true false
New val: false

Я что-то не так понимаю? Это ожидаемое поведение?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

На основании комментариев

Вы уверены, что у layoutLoading $ ровно одна подписка? За Например, у вас есть несколько асинхронных каналов, несколько компонентов экземпляра. - @ Багги

const source$ = of(1).pipe(
  tap(value => console.log("New val:", value))
);

source$.subscribe();
source$.subscribe();
// 1
// 1

Хорошо, вы правы, у меня есть две подписки с асинхронным. Я не знала что это работает по подписке. Поэтому, когда я хочу реагировать на различные изменения (в дополнение к асинхронным каналам), мне понадобится второй наблюдаемая труба, верно? - @Giacomo Voß

Да, если я правильно понял:

source$
  .pipe(distinctUntilChanged(fn))
  .subscribe(/* do something */)
0 голосов
/ 11 сентября 2018

Каждый раз, когда состояние меняется, ваш селектор будет работать.Это потому, что его параметром является все состояние.

...