RXJS 在可能未定义的对象上观察可观察对象

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

给定两个来源,其中之一可能未定义,我如何组合两者中最新的?

const observable1 = interval(100);
const observable2 = this.ref?.observable; // this is a reference to an angular viewchild that will not exist until some unknown point in the future

combineLatest([observable1, observable2]).subscribe(...)

一旦定义了 this.ref,我就需要订阅 this.ref.observable 的输出 observable(但我不知道什么时候会)。

我尝试过...

observable1.pipe(
   startWith(of(true)),
   switchMap((_) => interval(10)),
   skipWhile((_) => !this.ref),
   switchMap((_) => observable1),
   combineLatestWith(this.ref?.observable ?? EMPTY),
)
.subscribe((val1, val2]) => {...})

但是a)我无法弄清楚我在从combineLatestWith返回的类型周围遇到了什么TS错误,b)这对于看似简单的问题来说似乎过于复杂!

如果在我想开始观察时源可观察对象所在的对象可能未定义,是否有更简单的方法从可观察源获取排放?

javascript angular typescript rxjs
1个回答
0
投票

创建一个最初具有

null

的BehaviorSubject
subject: BehaviorSubject<any> = new BehaviorSubject<any>(null);

然后在

ngOnInit
constructor
订阅更改!

ngOnInit() {
    this.subject.pipe(
       startWith(of(true)),
       switchMap((_) => interval(10)),
       skipWhile((_) => !this.ref),
       switchMap((_) => observable1),
       combineLatestWith(this.ref?.observable ?? EMPTY),
    )
    .subscribe((val1, val2]) => {...})
}

视图子项通常在

ngAfterViewInit
上可见。

ngAfterViewInit() {
    if (this.viewChild?.nativeElement) {
        this.subject.next(this.viewChild.nativeElement);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.