gpt4 book ai didi

angular - 用作 PartialObserver 的 BehaviorSubject 打破了对 BehaviorSubject 的订阅

转载 作者:太空狗 更新时间:2023-10-29 18:27:31 26 4
gpt4 key购买 nike

我正在查看可观察对象的接口(interface),发现您可以将实现 PartialObserver 的任何内容传递给订阅函数。所以我用 BehaviorSubject 做到了。

像这样(一)

source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(this._titlesX$);

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

在 BehaviorSubject 的文档中,您可以找到:

A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

因此,当将 BehaviorSubject 用作​​ partialObserver 时,此行为会中断。(无双关语意)

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

source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(res => this._titlesX$(res));

一切都按预期进行。

为什么方法A不行?这是错误还是我只是用错了?

这是 stackblitz 所有设置的链接。 Link to stackblitz project

titleX:代表方法AtitleY:代表方法B

应该可以使用 BehaviorSubject 进行订阅。你订阅的时间应该无关紧要。否则不应将其作为订阅方法的参数。

最佳答案

原因是因为当你这样做的时候

source$.subscribe(this._titlesX$)

您已将源完全转换为 BehaviorSubject,因为 BehaviorSubject 是一个完整的观察者,包括完整的和错误的处理程序。 of 在一次发射后完成,因此它也完成了您的 BehaviorSubject,而完成的主体不会发射。但只是在 source$ 的订阅中调用 next 显然不会通过完整/错误处理程序。

如果您的来源更像是:

const source$ = interval(1000).pipe(map(v => [v.toString()]));

在未完成的地方,您会看到预期的行为。

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

关于angular - 用作 PartialObserver 的 BehaviorSubject 打破了对 BehaviorSubject 的订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com