首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用作BehaviorSubject的PartialObserver中断了BehaviorSubject上的订阅

用作BehaviorSubject的PartialObserver中断了BehaviorSubject上的订阅
EN

Stack Overflow用户
提问于 2019-08-14 17:04:50
回答 1查看 1.1K关注 0票数 3

我查看了可观察到的接口,并看到您可以将实现PartialObserver的任何东西传递给订阅函数。所以我用BehaviorSubject做了这个。

像这样(A)

代码语言:javascript
复制
source$
      .pipe(
        tap(() => console.log('X')),
      )
      .subscribe(this._titlesX$);

所以我做了,但发现了一些很奇怪的事情。如果我将服从订阅函数的行为传递给订阅函数,则会发出值,但要看到这一点,您必须在使用BehaviorSubject作为PartialObserver之前进行订阅。

在BehaviorSubject的docs中,您可以找到以下内容:

代码语言:javascript
复制
A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

因此,当使用BehaviorSubject作为partialObserver时,这种行为会中断。(没有双关意)

但是当我使用这种方法时:像这样(B)

代码语言:javascript
复制
source$
     .pipe(
        tap(() => console.log('X')),
      )
      .subscribe(res => this._titlesX$(res));

一切都如期而至。

为什么方法A不起作用?这是个窃听器还是我用错了?

这里有一个指向stackblitz所有设置的链接。链接到stackblitz项目

titleX:表示方法A titleY:表示方法B

订阅BehaviorSubject应该是可能的。你订阅的时间应该不重要。否则,不应该允许它作为订阅方法的参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-14 18:26:59

因为当你这么做的时候

代码语言:javascript
复制
source$.subscribe(this._titlesX$)

您已经将源代码完全传递给BehaviorSubject,因为BehaviorSubject是一个完整的观察者,包括完整的和错误的处理程序。of在一次发射之后就完成了,所以它也完成了您的BehaviorSubject,并且完成的主题不会发出。但是,仅在源代码$的订阅中调用next显然不会通过完整/错误处理程序。

如果你的线人更像是:

代码语言:javascript
复制
const source$ = interval(1000).pipe(map(v => [v.toString()]));

如果它没有完成,您将看到预期的行为。

闪电战https://stackblitz.com/edit/angular-gfmdgf?file=src/app/app.component.ts

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57499116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档