rxjs的Subject.create已被弃用 - 我该使用什么代替?

6

我在我的Angular应用程序的服务中有这段代码:

const subby = Subject.create(observer, observable)

但是我的IDE正确标记Subject.create为弃用。请问我应该使用什么替代方案?我已经尝试了new Subject(observer, observable),但没有成功。谢谢。

RxJS版本:6.4.0

Angular版本:7.2

2个回答

8

看源代码,静态函数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实际上并没有创建一个Subject,而是一个AnonymousSubject,我真的很想将其重命名为FrankenSubject,因为那描述了它是什么,你基本上将Observer粘贴到Observable上,然后称之为"Subject"。”
简而言之,使用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 有关,可能会对未来的读者有所帮助:

@danday74 你有找到那个“新方法”吗? - dstj
以下是一个 TypeScript lint 警告的提示... 警告:C:/Users/daniel/Desktop/biblical-hebrew/biblical-hebrew-fe/src/app/services/websocket.service.ts[34, 29]:create已经废弃:请使用new Subject() 替代。 - danday74
这仍然是我的代码库中唯一的tslint警告 :( - danday74
@danday74 更新了额外的研究。如果这些细节不足够,请提出一个新问题,并提供更多信息,例如您正在使用哪些参数以及如何使用结果。 - Vlad274

0

创建主题时不接受任何参数。因此,您需要像这样初始化它(new Subject())。然后,您可以在其上使用next方法来发出值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接