RxJS合并了observable,但更喜欢一个

时间:2018-03-15 21:49:02

标签: rxjs

我有两个可观察对象AB,我想要创建一个可以从B发出最新值的observable,但如果B没有&{ #39; t发射任何东西,它会从A发出最新值。我在想这样的事情:

merge(A.takeUntil(B), B)

但这似乎有点违反直觉,我希望有一个更具可读性的方法。是否有更规范的Rx方式来做到这一点?

1 个答案:

答案 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);