我有两个可观察对象A
和B
,我想要创建一个可以从B
发出最新值的observable,但如果B
没有&{ #39; t发射任何东西,它会从A
发出最新值。我在想这样的事情:
merge(A.takeUntil(B), B)
但这似乎有点违反直觉,我希望有一个更具可读性的方法。是否有更规范的Rx方式来做到这一点?
答案 0 :(得分:0)
此解决方案在使用中非常易读,但由于您将复杂性隐藏在自定义运算符中而变得复杂。自定义运算符的好处是您只能订阅每个可观察到的源。这意味着您的观测值不必太“热”。
不幸的是,该运算符中断了同步执行的可观察变量,并使每个值都通过了事件循环。
function prefer<T, R>(...observables: Observable<R>[]): Observable<R>{
return new Observable(observer => {
const subscrptions = new Array<Subscription>();
const unsub = (index) => {
for(let i = index; i < subscrptions.length; i++){
subscrptions[i].unsubscribe();
}
}
observables
.map(stream => publish()(stream))
.forEach((stream, index) => {
subscrptions.push(stream.subscribe((payload: R) => {
observer.next(payload);
unsub(index + 1);
subscrptions.length = index + 1;
}));
stream.connect();
});
return { unsubscribe: () => unsub(0) }
})
}
prefer(
interval(10000).pipe(map(_ => "Every 10,000")),
interval(5000).pipe(map(_ => "Every 5,000")),
interval(1000).pipe(map(_ => "Every 1,000")),
interval(250).pipe(map(_ => "Every 250"))
).subscribe(console.log);