Rxjs 无需订户即可观察到的监视器

Rxjs 无需订户即可观察到的监视器,rxjs,Rxjs,可观察到,我正在成为一个大风扇,我的堆栈开始显示它 我想构建一些监控工具,以连接到*n个可观察对象,并能够识别当前订阅的数量,而不必自己是订户 在一些Rx可视化库中达到峰值,我注意到它们对许多运营商进行了修补,这似乎有些过头了?我想您可以创建一个运营商来实现这一点(免责声明:未经测试): 然后可以这样使用: var subscriptionObserver = Rx.Observer.create((x) => console.log("Current #: " + x); Rx.Obs

可观察到,我正在成为一个大风扇,我的堆栈开始显示它

我想构建一些监控工具,以连接到*n个可观察对象,并能够识别当前订阅的数量,而不必自己是订户


在一些Rx可视化库中达到峰值,我注意到它们对许多运营商进行了修补,这似乎有些过头了?

我想您可以创建一个运营商来实现这一点(免责声明:未经测试):

然后可以这样使用:

var subscriptionObserver = Rx.Observer.create((x) => console.log("Current #: " + x);

Rx.Observable.fromEvent($button, 'click')
  .map(e => /*Map a value*/)
  .flatMap(x => $.get(`search?q=${x.value}`))
  .activeSubscriptions(subscriptionObserver)
  .subscribe();

这基本上是我将采取的方法的天真实现。它的性能不会很差(因为您需要像其他一些运营商所使用的那样,采取更注重性能的方法)。这种方法的一个警告是,如果您在
多播
风格的上游使用它,您将只能看到一个订户,因为这些运营商的实现是如何共享订阅的

不确定这些来自
doOnXXX
系列的副作用操作符是否可用于RxJS。无论如何,以下是如何在RxJava中为单个可观察对象实现这一点的想法:

    final Subject<Upd, Upd> monitorSubj = ReplaySubject.create();

    Observable.just("one", "two")
        // ....
        .doOnSubscribe(() -> monitorSubj.onNext(Upd.SUBSCRIBE))
        .doOnUnsubscribe(() -> monitorSubj.onNext(Upd.UNSUBSCRIBE))
        // ....
        .subscribe(System.out::println);

    monitorSubj.subscribe(new Subscriber<Upd>() {

        private int num = 0;


        @Override
        public void onNext(final Upd upd) {
            switch (upd) {
                case SUBSCRIBE:
                    num++;
                    break;
                case UNSUBSCRIBE:
                    num--;
                    break;
            }
            System.out.println("subscribers change : num = " + num);
        }

        @Override
        public void onCompleted() {
            // ...
        }

        @Override
        public void onError(Throwable e) {
            // ...
        }

    });
    final Subject<Upd, Upd> monitorSubj = ReplaySubject.create();

    Observable.just("one", "two")
        // ....
        .doOnSubscribe(() -> monitorSubj.onNext(Upd.SUBSCRIBE))
        .doOnUnsubscribe(() -> monitorSubj.onNext(Upd.UNSUBSCRIBE))
        // ....
        .subscribe(System.out::println);

    monitorSubj.subscribe(new Subscriber<Upd>() {

        private int num = 0;


        @Override
        public void onNext(final Upd upd) {
            switch (upd) {
                case SUBSCRIBE:
                    num++;
                    break;
                case UNSUBSCRIBE:
                    num--;
                    break;
            }
            System.out.println("subscribers change : num = " + num);
        }

        @Override
        public void onCompleted() {
            // ...
        }

        @Override
        public void onError(Throwable e) {
            // ...
        }

    });
private int num = 0;
private final synchronized void handleUpd(final Upd upd) {
    switch (upd) {
        case SUBSCRIBE:
            num++;
            break;
        case UNSUBSCRIBE:
            num--;
            break;
    }
    System.out.println("subscribers change : num = " + num);
}
public void run() {
    Observable.just("one", "two")
        // ....
        .doOnSubscribe(() -> handleUpd(Upd.SUBSCRIBE))
        .doOnUnsubscribe(() -> handleUpd(Upd.UNSUBSCRIBE))
        // ....
        .subscribe(System.out::println);
}