rxjs Subject.create已过时-应该改用什么?

时间:2019-04-06 17:52:43

标签: angular rxjs

我的Angular应用程序的服务中包含以下代码:

const subby = Subject.create(observer, observable)

但是我的IDE正确地将Subject.create标记为已弃用。我应该用什么代替谢谢?我尝试过new Subject(observer, observable),但没有任何乐趣。 TIA。

  

RxJS版本:6.4.0

     

角度版本:7.2

2 个答案:

答案 0 :(得分: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因为描述了它是什么,所以您基本上可以粘合   一个可观察对象的观察者,并将其称为“主题”。

简而言之,使用Subject.create(或AnonymousSubject对象)是实现目标的一种混乱方法。

您可以查看此类here的源代码,但要点是,它是一个毫无意义的类,混淆了正在发生的事情。在代码中,您可以看到destinationsourceObserverObservable参数)没有交互作用。

因此,修复代码的“正确方法”是完全杀死该对象,并更明确地说明相关事件的路由方式。

例如:

// 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有关的以下警告,这些警告可能与将来的读者有关:

答案 1 :(得分:1)

主题在创建时将不接受任何参数。所以你需要初始化它  例如(new Subject()。之后,您可以在其上使用next方法发出值。