RxJS 6 / Когда оператор крана выдает значение - PullRequest
0 голосов
/ 13 ноября 2018

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

Мой вариант использования с ngrx.

 ...
tap(() => {
    this.store.dispatch(new SetValue("Hello World"));
  }
}),
switchMap(() => this.store),
select(state => state.value),
tap(state => {
  if (state === undefined) {
    throw new Error("Couldn't find value");
  }
})

SetValue - это класс, который реализует ngrx

export class SetValue implements Action {
  readonly type = SET_VALUE;
  constructor(public payload: string) {}
}

То, что я пытаюсь реализовать, - это установить значение в хранилище, а затем проверить, действительно ли оно установлено.

Могу ли я считать, что отправка завершена после нажатия оператора?

Ответ

Я использовал это на Angular Router Guard , чтобы установить начальное состояние по параметрам в URL, поэтому я закончил фильтрацию, чтобы продолжить, только когда в хранилище появилось новое значение

 ...
tap(() => this.store.dispatch(new SetValue("Hello World"))),
switchMap(() => this.store),
select(state => state.value),
filter(value => value === "Hello World"),
take(1)

1 Ответ

0 голосов
/ 13 ноября 2018

Большинство операций в RxJS являются синхронными, поэтому, если this.store.dispatch(new SetValue("Hello World")) не выполнит какую-либо асинхронную задачу, она, вероятно, будет работать должным образом (это все еще просто субъект под капотом).

Однако вы не должны полагаться на это поведение. NgRx может изменить свои внутренние функции, и в целом лучше не полагаться на синхронность / асинхронность операторов RxJS (это уже случалось в прошлом, например, from() с RxJS 4 до RxJS 5).

Если вы хотите убедиться, что что-то установлено, измените ваш new SetValue("Hello World") эффект, чтобы он испускал другое действие после того, как оно выполнит то, что нужно.

...