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