【发布时间】:2021-11-07 21:12:45
【问题描述】:
我正在用这个意图组成一个可观察的流:
具有从 Web 请求发出的可观察到的发射和 2 个触发器,一个用于重新发射获得的值,另一个触发器用于重新加载该值(重新执行请求)。此外,迟到的订阅者应该获得最后获得的值并能够接收重置/重新加载。
最初我得到了以下代码(不起作用):
public readonly initialValueFlat$ = this.seed$
.pipe(
switchMap(seed => defer(
() => {
this._isLoading$$.next(true);
return this.getFakeData(seed)
.pipe(
finalize(() => this._isLoading$$.next(false)));
})),
repeatWhen(x => this._reloadTrigger$),
switchMap(x => of(x)),
repeatWhen(x => this._resetTrigger$),
shareReplay(1));
在这方面我找到了以下解决方案:
public readonly initialValue$ = this.seed$
.pipe(
switchMap(seed => defer(
() => {
this._isLoading$$.next(true);
return this.getFakeData(seed)
.pipe(
finalize(() => this._isLoading$$.next(false)));
})
.pipe(
repeatWhen(x => this._reloadTrigger$))
.pipe(
switchMap(x =>
of(x)
.pipe(
repeatWhen(x => this._resetTrigger$))))),
shareReplay(1));
但我并不完全清楚为什么第一个不起作用,以及多个 .pipe 运算符如何影响链。
你能帮我说清楚吗?
谢谢
【问题讨论】:
-
两条链不同。在第二个中,
repeatWhen在switchMap内部使用,而在第一个中,它在外部使用肯定会产生不同的行为。但是,我不知道您期待什么行为,所以我无法判断哪个行为是正确的。 -
好吧,意图是什么并不重要,重要的是结构决定了差异,反正我用你问的信息更新了帖子
-
这两条链还是不同的,所以我不希望有同样的行为:)。
-
实际上的问题是:管道操作员的哪些特性使它们不同? :)
-
区别不在于使用
pipe(),你有两个不同结构的链(不同的嵌套)。这就是为什么你会看到不同的行为。这不是因为您多次使用pipe()。
标签: rxjs observable reactive rxjs-observables