【发布时间】:2019-08-28 07:55:45
【问题描述】:
我的 Angular 应用中的服务中有此代码:
const subby = Subject.create(observer, observable)
但我的 IDE 正确地将 Subject.create 标记为已弃用。我应该用什么代替谢谢?我试过new Subject(observer, observable) 但没有快乐。 TIA。
RxJS 版本:6.4.0
Angular 版本:7.2
【问题讨论】:
我的 Angular 应用中的服务中有此代码:
const subby = Subject.create(observer, observable)
但我的 IDE 正确地将 Subject.create 标记为已弃用。我应该用什么代替谢谢?我试过new Subject(observer, observable) 但没有快乐。 TIA。
RxJS 版本:6.4.0
Angular 版本:7.2
【问题讨论】:
查看源代码,静态函数Subject.create(destination, source) 只是new AnonymousSubject<T>(destination, source) 的一个包装器。
如果您只是想处理警告,您可以将代码更改为
import { AnonymousSubject } from 'rxjs/internal/Subject';
const subby = new AnonymousSubject<T>(observer, observable);
RxJs 已经记录了他们进行此更改的动机here。重要的引述:
Subject.create 实际上并不创建一个主题,而是一个 AnonymousSubject,我真的很想重命名为 FrankenSubject 因为它描述了它是什么,所以你基本上是粘合 一个 Observer 到一个 Observable 并将其称为“主题”。
简而言之,使用Subject.create(或AnonymousSubject 对象)是实现目标的一种令人困惑的方式。
你可以查看这个类的源代码here,但要点是它是一个毫无意义的类,它混淆了正在发生的事情。在代码中,您可以看到destination 和source(Observer 和Observable 参数)没有交互。
因此,修复代码的“正确方法”是完全杀死该对象,并更明确地说明相关事件的路由方式。
例如:
// This code...
const subby = Subject.create(observer, observable);
subby.subscribe((value: value) => console.log(value));
subby.next("Test");
// Should be replace by this code
// Nothing
observable.subscribe((value: value) => console.log(value));
observer.next("Test");
我还发现了以下关于使用 Subject.create 的警告,这些警告可能与未来的读者有关:
【讨论】:
主题在创建时不会接受任何参数。所以你需要初始化它
喜欢(new Subject())。之后你可以使用 next 方法来发出值。
【讨论】: