RxJS 6 / Tap运算符何时发出值

时间:2018-11-13 14:06:12

标签: rxjs ngrx rxjs5 rxjs6 ngrx-store

我一直想知道是否可以肯定地认为,在使用tap运算符之后,其内部的副作用已经完成。

我的用例是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 Guards 上使用了它,以通过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 :(得分:3)

RxJS中的大多数操作都是同步的,因此如果this.store.dispatch(new SetValue("Hello World"))不执行任何异步任务,它可能会按预期工作(它仍然只是主题下的对象)。

但是,您不应该依赖此行为。 NgRx可能会更改其内部结构,通常最好不要依赖RxJS运算符的同步性/异步性(这已经发生在过去,例如from()从RxJS 4到RxJS 5)。

如果要确保已设置某些内容,请更改new SetValue("Hello World")效果以使其在完成需要执行的操作后发出另一个动作。