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