【问题标题】:rxjs Subject.create deprecated - what should I use instead?rxjs Subject.create 已弃用-我应该改用什么?
【发布时间】: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 rxjs


    【解决方案1】:

    查看源代码,静态函数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,但要点是它是一个毫无意义的类,它混淆了正在发生的事情。在代码中,您可以看到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 的警告,这些警告可能与未来的读者有关:

    【讨论】:

    • @danday74 你有没有得到那个“新方法”?
    • 这是来自 ts lint 警告的线索... 警告:C:/Users/daniel/Desktop/biblical-hebrew/biblical-hebrew-fe/src/app/services/websocket.service。 ts[34, 29]: create 已弃用:改用 new Subject()
    • 这仍然是我的代码库中的一个 tslint 警告 :(
    • @danday74 更新了额外的研究。如果该详细信息还不够,我建议您提出一个新问题,并提供其他信息,例如您正在使用哪些参数以及您如何使用结果
    【解决方案2】:

    主题在创建时不会接受任何参数。所以你需要初始化它 喜欢(new Subject())。之后你可以使用 next 方法来发出值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2014-01-09
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      相关资源
      最近更新 更多