假设我有两个观测值。每当第一个可观察到的发射出光时,我要等待2秒钟,以查看在此期间另一个可观察到的物体是否发射出光。如果是,则不发射任何东西。如果否,则发出。
示例:
const start$ = this.events.pipe(
delay(1000),
takeUntil(theSecondObservable) // WHAT SHOULD BE HERE?
).subscribe((value) => {
console.log(value);
});
答案 0 :(得分:2)
当end $ observable发出并使用RxJS 6语法时,此解决方案无法完成。
const start$ = this.router.events.pipe(map(() => true));
const end$ = this.router.events.pipe(map(() => false));
merge(start$, end$)
.pipe(debounceTime(2000), filter(value => value))
.subscribe(value => console.log(value));
如果要过滤路由器事件,则可能不需要两个可观察对象。
this.router.events
.pipe(debounceTime(2000), filter(event => event instanceof NavigationEnd))
.subscribe(value => console.log(value));
答案 1 :(得分:0)
const start$ = race(this.events.pipe(delay(1000)), theSecondObservable).subscribe(value => /** ... */);
一旦其中一个可观察对象发出一个对象,另一个可观察对象将被忽略,只有“赢家”发出的值将被传递给订户。在您的订阅功能中,您可以执行一些逻辑以弄清楚您的价值来自哪个观察值。
答案 2 :(得分:0)
您是否对限制第一个观察者的发射或仅在最终结果中感兴趣?
您可以使用种族...
let r = race(observer1.pipe(delay(2000)), observer2)
// r will emmit from observer1 only if observer2 didnt emmit, else it will emmit from observer2
答案 3 :(得分:0)
借助上述答案,我得以解决。但是,他们并没有完全回答我的问题,可能会有更好的方法。我的解决方案:
const end$ = this.router.events.pipe(
map(() => false),
);
const start$ = this.router.events.pipe(
map(() => true),
);
merge(
end$,
start$.pipe(
switchMap(() => {
return race(end$, of(true).pipe(delay(2000)));
}),
filter((value) => value === true) // this really works only with booleans, not sure how I'd do it with more
// complex objects
)
).subscribe((value) => {
console.log(value);
});