我一直在寻找答案,但是找不到任何结论。
当我在first
上使用observable
运算符,然后在其上通过管道传送其他运算符(如swtichMap
或map
时,会发生什么情况?
我所知道的,当我使用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);
我认为会发生什么:
最后,使用switchMap()
有什么改变吗?如果我们使用switchMap()
而不是flatMap()
,它将以每个新值结束内部订阅,但是上面的问题会发生什么?
编辑:我们应该使用first()
作为管道的开始,并最终确保订阅将结束吗?
// 3. Has these any sense?
myObs.pipe(frist(), map(data => return data.content), first()).subscribe(console.log);
答案 0 :(得分:1)
如果在first()之后使用switchMap
,concatMap
或mergeMap
(flatMap
),则可能会导致多个事件,具体取决于您的代码,因此请检查代码是否它产生事件。常规map
不能引发新事件。
// this stream emits event every second.
stream$.pipe(
first(),
mergeMap(() => interval(1000)
);
无需在开头和结尾放置first
。如果您知道流中没有流(请不要像运算符一样调用mergeMap
),请将其放在开头。在其他情况下,请放在first
末尾。