Observables:首先如何与其他运营商合作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Observables:首先如何与其他运营商合作?相关的知识,希望对你有一定的参考价值。
我一直在寻找答案,但我找不到任何结论。当我在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);
我认为发生了什么:
- (1)和(2)是相同的,如果我们不进行unsubscibe,订阅将永远存在,但它只会发出一个值。内部订阅将结束,但外部订阅将不会。
- (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)
);
没有必要在开始和结束时放置first
。如果你知道你没有流中的流(不要像运算符一样调用mergeMap
),请将它放在开头。在其他情况下,最后放在first
。
以上是关于Observables:首先如何与其他运营商合作?的主要内容,如果未能解决你的问题,请参考以下文章