Rxjs 可观察对象:第一个操作符与其他操作符的行为如何?

Rxjs 可观察对象:第一个操作符与其他操作符的行为如何?,rxjs,observable,angular2-observables,Rxjs,Observable,Angular2 Observables,我一直在寻找答案,但没有找到任何结论。 当我首先对可观察的对象使用操作符,然后像swtichMap或map那样在其上使用其他操作符时会发生什么 据我所知,当我先使用然后订阅时,它将一直处于活动状态,直到返回第一个值: myObs.first().subscribe(console.log); // I shouldn't be worried about unsiscribe myObs.pipe(first()).subscibe(console.log); // The same here

我一直在寻找答案,但没有找到任何结论。 当我首先对
可观察的
对象使用
操作符,然后像
swtichMap
map
那样在其上使用其他操作符时会发生什么

据我所知,当我先使用
然后订阅时,它将一直处于活动状态,直到返回第一个值:

myObs.first().subscribe(console.log);
// I shouldn't be worried about unsiscribe
myObs.pipe(first()).subscibe(console.log);
// The same here
但是当我使用管道传输其他函数时会发生什么,我将把问题分为两点,首先,当我使用简单运算符(不返回其他可观察的运算符)时会发生什么:

我认为会发生什么:

  • (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);

如果在first()之后使用
switchMap
concatMap
mergeMap
flatMap
),可能会导致多个事件,具体取决于您的代码,因此请检查代码是否生成事件。常规
map
不能导致新事件

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

无需在开始和结束时将
放在第一位
。如果您知道流中没有流,请将其放在开始位置(不要像调用操作符一样调用
mergeMap
)。在其他情况下,将
放在第一位
放在末尾。

我看起来像是想使用
flatMap
而不是
map()
我知道的所有使用
map
的地方,我不会得到任何新事件,但我想问的是自动取消订阅。假设我的流总是只返回一个值,那么点
2
订阅会在第一次发出值后完成吗?我想不会的t@Gonzo,我相信,如果
2
,您不需要取消订阅。这是一篇很受欢迎的关于这个的帖子
// this stream emits event every second.
stream$.pipe(
  first(),
  mergeMap(() => interval(1000)
);