Observables:首先如何与其他运营商合作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)是相同的,如果我们不进行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()之后使用switchMapconcatMapmergeMapflatMap),它可能会导致多个事件依赖于您的代码,因此如果它生成事件,请检查代码。常规map不能导致新事件。

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

没有必要在开始和结束时放置first。如果你知道你没有流中的流(不要像运算符一样调用mergeMap),请将它放在开头。在其他情况下,最后放在first

以上是关于Observables:首先如何与其他运营商合作?的主要内容,如果未能解决你的问题,请参考以下文章

如何运营一家数据标注公司 (资源特点篇)

如何在 Hystrix Observables 中传递 traceIds?

传言PayPal将通过与Paxos合作提供加密交易

游戏联运详解

第四方支付是什么?前景如何?

聚焦用户精细化运营场景,极客邦科技与火山引擎数智平台达成合作