2017-04-10 64 views
1

在rxJava 1.x中有可能做这样的事情:也返回Observable<Foo>订阅同一用户在rxJava 2

我无法找到同样的方法

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

GetNewObservable()在rxJava中2.在Observable对象上没有接受Emitter或ObservableEmitter的订阅方法。我想我可以做这样的事情:

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

但我不知道是否有像rxJava 1

由于一些更直接的方式。

+0

究竟什么是你想达到这种不明显的方法呢?必须有更清洁的方式来做到这一点。请描述你的代码的目的。 –

+0

当然,可能有更多的方法来解决这个问题,但我很好奇rxJava 2中是否真的没有等价物。这种方法实际上在[Rex Programming with RxJava]中提到过(http://shop.oreilly.com /product/0636920042228.do)书。 但回到我的情况我正在做android lib,我希望有可观察到的女巫会每x分钟做一些动作。所以我有一个可观测的计时器。但“工作”需要授予一些权限。我只是想首先检查权限,并且只有在订阅计时器可观察时才可以。否则返回onError ... – bio007

+0

那么如何:'if(permissionGranted)return Observable.interval(...)。map(...);否则返回Observable.error(...);'? –

回答

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()) 
+0

是的,只检查一次权限对我来说就足够了,所以第三选项是最好的,但并不真正如此优雅,我希望...因此,在rxJava 2没有等效就你所知? – bio007

+0

我调整了选项3并添加了选项4.我认为选项3与您的原始意图最接近,即“推迟”源选择直到订阅时间。 –