RxJS 6 /点按操作员何时发出值

问题描述 投票:2回答:1

我一直在想是否可以安全地假设使用了点击操作符后,其内部的副作用已经完成。

我的用例是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 ngrx rxjs5 rxjs6 ngrx-store
1个回答
3
投票

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

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

如果你想确定某些东西已被设置,那么在完成它需要做的事情之后,改变你的new SetValue("Hello World")效果以发出另一个动作。

© www.soinside.com 2019 - 2024. All rights reserved.