可观察的:与其他运算符相比,它首先表现如何?

时间:2018-12-21 13:43:01

标签: rxjs observable angular2-observables

我一直在寻找答案,但是找不到任何结论。 当我在first上使用observable运算符,然后在其上通过管道传送其他运算符(如swtichMapmap时,会发生什么情况?

我所知道的,当我使用first然后订阅时,它将一直存在,直到返回第一个值:

myObs.first().subscribe(console.log);
// I shouldn't be worried about unsiscribe
myObs.pipe(first()).subscibe(console.log);
// The same here

但是当我通过管道传输其他函数时会发生什么,我将问题分为两点,首先,当我使用简单的运算符(不会返回其他可观察到的运算符)时会发生什么:

// 1. Will this subscription end on first emitted value?
myObs.first().pipe(map(data => return data.content)).subscribe(console.log);

// 2. Is this different from (1)
myObs.pipe(first(), map(data => return data.content)).subscribe(console.log);

// 3. Will this subscription end on first emitted value?
myObs.pipe(map(data => return data.content), first()).subscribe(console.log);

我认为会发生什么:

  • (1)和(2)相同,并且如果我们不取消订阅,则订阅将永远有效,但只会发出一个值。内部订阅将终止,但外部订阅将不会。
  • (3)与(1,2)相反,内部订阅将永远存在,而外部订阅将在首次发出值后结束。有内部订阅吗?还是我错了?

最后,使用switchMap()有什么改变吗?如果我们使用switchMap()而不是flatMap(),它将以每个新值结束内部订阅,但是上面的问题会发生什么?

编辑:我们应该使用first()作为管道的开始,并最终确保订阅将结束吗?

// 3. Has these any sense?
myObs.pipe(frist(), map(data => return data.content), first()).subscribe(console.log);

1 个答案:

答案 0 :(得分:1)

如果在first()之后使用switchMapconcatMapmergeMapflatMap),则可能会导致多个事件,具体取决于您的代码,因此请检查代码是否它产生事件。常规map不能引发新事件。

// this stream emits event every second.
stream$.pipe(
  first(),
  mergeMap(() => interval(1000)
);

无需在开头和结尾放置first。如果您知道流中没有流(请不要像运算符一样调用mergeMap),请将其放在开头。在其他情况下,请放在first末尾。