2016-12-07 5 views
1

Я приковал несколько операторов rx, чтобы выполнить несколько задач. Мне нужно получить доступ к полю из объекта, который находится в родительском потоке, ниже по потоку.RxJava access item downstream

ie. Как я могу получить доступ к channel.uid вниз по течению?

createThing(panel) // Observable<~> 
    .flatMapSingle(
      channel -> { 
     return createOrUpdateItem(channel); 
    }) 
    .flatMapCompletable(
      item -> { 
     return linkItemToChannel(item.name, /* need access to channel.uid here */ channel.uid); 
    }); 

ответ

2

Использование Observable.flatmap(Function mapper, BiFunction resultSelector) (или Flowable версия). Например .:

createThing(panel) //I assume that this method returns Observable 
    .flatMap(channel -> createOrUpdateItem(channel).toObservable(), 
      (channel, item) -> linkItemToChannel(item.name, channel.uid).toObservable()) 
    .toCompletable(); 

Там нет аналогичных перекрытых метод flatMapSingle или flatMapCompletable, так что вы должны преобразовать Single и Completable в Observable (или Flowable). Или вы можете написать свой собственный оператор;)

+1

О, круто! 'flatMap' меня удивляет ... –

1

Добавление к @ maxost Ответим, здесь вы можете избежать последнего toCompletable() и toObservable():

createThing(panel) 
.flatMap(new Function<Channel, ObservableSource<? extends Item>>() { 
      @Override public ObservableSource<? extends Item> apply(Channel channel) throws Exception { 
       return createOrUpdateItem(channel).toObservable(); 
      } 
     }, 
     new BiFunction<Channel, Item, Completable>() { 
      @Override public Completable apply(Channel channel, Item item) throws Exception { 
       return linkItemToChannel(item.name, channel.uid); 
      } 
     } 
) 
.ignoreElements() // converts to Completable 

Lambda'd:

createThing(panel) 
.flatMap(channel -> createOrUpdateItem(channel).toObservable(), 
     (channel, item) -> linkItemToChannel(item.name, channel.uid)) 
.ignoreElements() // converts to Completable