我一直在想是否可以安全地假设使用了点击操作符后,其内部的副作用已经完成。
我的用例是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)
RxJS中的大多数操作都是同步的,所以如果this.store.dispatch(new SetValue("Hello World"))
不会执行任何异步任务,它可能会按预期工作(它仍然只是一个主题)。
但是,您不应该依赖此行为。 NgRx可能会改变它的内部结构,一般来说最好不要依赖RxJS运算符的同步性/异步性(这在过去已经发生在例如从RxJS 4到RxJS 5的from()
中)。
如果你想确定某些东西已被设置,那么在完成它需要做的事情之后,改变你的new SetValue("Hello World")
效果以发出另一个动作。