我一直想知道是否可以肯定地认为,在使用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)
答案 0 :(得分:3)
RxJS中的大多数操作都是同步的,因此如果this.store.dispatch(new SetValue("Hello World"))
不执行任何异步任务,它可能会按预期工作(它仍然只是主题下的对象)。
但是,您不应该依赖此行为。 NgRx可能会更改其内部结构,通常最好不要依赖RxJS运算符的同步性/异步性(这已经发生在过去,例如from()
从RxJS 4到RxJS 5)。
如果要确保已设置某些内容,请更改new SetValue("Hello World")
效果以使其在完成需要执行的操作后发出另一个动作。