【发布时间】:2021-01-16 21:03:24
【问题描述】:
我对 Rxjs 有点陌生,试图确定是否有一种方法可以知道 Rxjs 主题的所有观察者何时完成了他们为响应 .next 所做的任何事情。
例如,假设我有如下所示的 Auth 类:
import { Subject } from "rxjs";
interface AuthEvent {
eventName : string;
}
class Auth {
static getInstance() : Auth {
//return a singleton of Auth
}
private constructor() {}
authSubject$ : Subject<AuthEvent> = new Subject();
login() {
//do login things
this.notify("login");
}
logout() {
//do logout things
this.notify("logout")
}
notify(event : string) {
let evt = <AuthEvent>{};
evt.eventName = event;
this.authSubject$.next(evt);
}
}
假设我有 5 个不同的订阅者类,所有这些类都包含看起来像这样的代码
class SomeWidget {
constructor() {
Auth.getInstance().authSubject$.subscribe( (evt) => {
switch(evt.eventName){
case "login":
this.handleLogin()
break;
case "logout":
this.handleLogout();
break;
}
});
}
根据我的观察,当 Auth 对象调用 this.authSubject$.next(evt) 时,该主题上的活动订阅似乎是异步处理的。 (我不确定这是否完全正确,但事情完成的顺序似乎有点随机)。即notify方法会立即返回,无需等待所有订阅者处理完事件。
是否有某种方法可以让 Auth 类确定所有小部件何时完成处理由next 触发的事件,而无需在小部件本身上添加代码? IE。也许通过检查有关该主题的东西?还是我弄错了,next只有在所有订阅者都响应完事件后才会返回?
【问题讨论】:
-
Next 不返回任何内容; RxJS 使用观察者模式,主体只负责更新所有订阅者,而不负责他们的结果(如果有的话)。
-
这听起来像是 XY 问题。
-
好的,谢谢。什么是 XY 问题 Ingo?
-
您问的是您认为想要回答的问题,但您的实际问题可能是其他问题(假设您不是纯粹出于好奇而问这个问题,而是为了实现某些目标)。 en.wikipedia.org/wiki/XY_problem
-
如果您可以分享更多信息,说明您为什么想知道您的观察者是否完成了他们的工作,那么您的问题可能会有更好的解决方案。是的,
next只是将新事件放入流中并返回,它不会等待观察者完成对事件的处理。
标签: typescript rxjs