1

我已经将几个rx操作员链接在一起来执行多项任务。我需要从下游的父流中的对象访问字段。

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);
    });
4

2 回答 2

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();

flatMapSingleor没有类似的覆盖方法flatMapCompletable,因此您必须将Singleand转换CompletableObservable(或Flowable)。或者您可以编写自己的运算符;)

于 2016-12-08T00:49:32.970 回答
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

拉姆达德:

createThing(panel)
.flatMap(channel -> createOrUpdateItem(channel).toObservable(),
        (channel, item) -> linkItemToChannel(item.name, channel.uid))
.ignoreElements() // converts to Completable
于 2016-12-08T18:51:52.527 回答