【发布时间】:2020-08-08 04:59:27
【问题描述】:
我正在使用 RxJS 6 开发一个 Angular 8 应用程序。我认为我在使用 RxJS 方面做得很好,但今天我遇到了一些事情,让我觉得我对它的工作原理有一个根本的误解。
我有以下订阅:
this.nudgePauseConnectivity$.pipe(
tap(() => console.log(1)),
withLatestFrom(this.hotspotPausedState$()),
tap(() => console.log(2)),
filter(([nudgePause, connectionPaused]) => connectionPaused === enums.HotspotPausedStateEnum.FALSE),
tap(() => console.log(3)),
switchMapTo(this._store.pipe(select(this._hotspotSelectors.selectUsername))),
tap(() => console.log(4)),
switchMap(username =>
this._cabinApiV2Service.subscriberService.getRemainingConnectivityAllowance(username)
),
tap(() => console.log(5)),
map(remainingConnectivityAllowance => SubscriberConnectivityAllowanceTransformer.transform(
remainingConnectivityAllowance
))
).subscribe(() => {/* Do something */});
nudgePauseConnectivity$ 是我用来执行 observable 主体的主题,如下所示:
pauseConnectivity() {
this.nudgePauseConnectivity$.next({});
}
this._hotspotSelectors.selectUsername 是一个 NgRx 选择器,如果你没有在从 store 返回值的 observable 中使用 NgRx。
我的问题是这样的:我认为表达式会对this.nudgePauseConnectivity$ 发出的每个值执行一次。我希望在控制台中看到:
1
2
3
4
5
然而,似乎即使this.nudgePauseConnectivity$ 没有发出值,如果this._store.pipe(select(this._hotspotSelectors.selectUsername)) 发出一个值,表达式的执行也会开始,所以我在控制台中看到了这种输出:
1
2
3
4
5
4
5
我对此感到非常困惑!我不希望表达式在中间开始执行:我希望表达式仅在 this.nudgePauseConnectivity$ 发出一个值时执行,而不考虑 switchMaps 或其他高阶可观察运算符中的任何表达式的值在链中。
我如何做到这一点?
【问题讨论】:
标签: angular typescript rxjs