组合多个流/可观察对象以使用映射运算符

时间:2019-08-15 08:06:54

标签: rxjs

我有2台服务器,它们具有单独的流/可观察对象,如何使两者都使用同一链,以便可以用alisti.next().extractFile(attachpath); // error points to this line switchMap等运算符来控制它们?

flatMap

例如,如果我从服务器获取并且getStream花费了一段时间,并且在getFastStream完成后仍在进行中,我想使用switchMap阻止第一个getStream的覆盖。我怎样才能做到这一点?我是rxjs的新手,所以我尝试的可能不是应该如何使用它。

可观察的

if (serverNumber == 1) {
  this.streamService.getStream('test 1')
    .pipe(
      map(image => console.log(image))
    ).subscribe();
}
else  {
  this.streamService.getFastStream()
    .pipe(
      map(image => console.log(image))
    ).subscribe();
}

那我必须将流推到其中一个运算符可观察的图像上吗?

  images$: Observable<string> = new Observable<string>();

模板:

this.images$.pipe(
  switchMap(this.streamService.getStream(1))
)

2 个答案:

答案 0 :(得分:1)

首先在可观察到的 fast 上使用takeUntil运算符。第二次使用merge获得快速可观察的结果,直到可观察的结果开始出现。

import { merge } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

const slow$ = this.streamService.getStream('test 1').pipe(
  map(image => console.log(image))
);

const fast$ = this.streamService.getFastStream().pipe(
  map(image => console.log(image)),
  takeUntil(slow$)
);

merge(
  fast$,
  slow$
).subscribe()
  

这里是StackBlitz DEMO来演示的。

答案 1 :(得分:0)

RXJS race可观察的创建者可能会有所帮助。

var server1$ = this.streamService.getStream('test 1');
var fastServer$ = this.streamService.getFastStream();

var fastest$ = race(server1$, fastServer$)
              .pipe(map(image=> console.log(image)));
fastest$.subscribe();