订阅rxJava 2中的同一订户

时间:2017-04-10 11:20:24

标签: rx-java observable subscribe rx-java2 reactive

在rxJava 1.x中,有可能做到这样的事情:

Observable.<Foo>create(subscriber -> {
    ...
    getNewObservable().subscribe(Subscribers.wrap(subscriber));
})

GetNewObservable()也返回Observable<Foo>

我无法在rxJava 2中找到相同的方法。没有订阅方法接受Observable对象上的Emitter或ObservableEmitter。我想我可以这样做:

Observable.<Foo>create((ObservableEmitter<Foo> emitter) -> {
    ...
    getNewObservable().subscribe(emitter::onNext, emitter::onError, emitter::onComplete);
})

但是我想知道rxJava 1中是否有更直接的方式。

感谢。

1 个答案:

答案 0 :(得分:0)

1)执行您在评论中描述的内容的一种方式:

Observable.interval(...)
    .map(n -> {
            if (!permissionGranted)
                throw new AccessDeniedException();
            ... // do work
            return result;
        })

2)另一种方式:

Observable.interval(...)
    .flatMap(n -> {
            if (permissionGranted) {
                ... // do work
                return Observable.just(result);
            } else {
                return Observable.error(new AccessDeniedException());
            }
        })

3)另一种方式(只检查一次许可):

Observable.defer(() -> {
            if (permissionGranted) {
                return Observable.interval(...)
                    .map(n -> {
                        ... // do work
                        return result;
                    });
            } else {
                return Observable.error(new AccessDeniedException());
            }
        })

4)还有一个(最多被动):

Completable.fromCallable(() -> {
            if (!permissionGranted)
                throw new AccessDeniedException();
            return true; // returned value does not matter
        })
    .andThen(Observable.interval(...)
                    .map(n -> {
                        ... // do work
                        return result;
                    })
        )

你可以重构为:

askForPermission().andThen(getNewObservable())