【问题标题】:How to tell if observers of a rxjs Subject have finished processing the event?如何判断 rxjs 主题的观察者是否已完成事件处理?
【发布时间】: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


【解决方案1】:

观察者模式没有为您提供(默认)方法来等待所有订阅者完成处理。它将事件的发出与这些事件的处理分离。

您的观察是正确的,Auth 事件的订阅者是异步调用的。您不应假设这些订阅者收到通知的顺序。

如果您想在订阅者处理完毕后收到“通知”,有一些方法可以做到(我认为:

  • 在 auth 类中注入您的订阅,而不是提供 observable Auth.addAuthEventObserver(Observer&lt;AuthEvent&gt;)。当 Widget 被销毁时,您还需要通过通知您的 Auth 类不再需要给定的 Observer 来满足 Observer 的生命周期
  • 在您的 Auth 类中添加一个函数,所有订阅者都可以向该函数发出他们已“处理”事件的信号。然后,您的 Auth 类可以延迟发送事件,直到所有订阅者都确认他们的处理。

感觉你可能需要重新评估 Observer 和 Observables 的职责,这样就不需要这些 hacky 感觉的解决方案了?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多