我有一个可观察的名单obs1,obs2,obs3,...,
每个人都可以发出一些项目(来自mongodb数据库),我只对前N个项目感兴趣。我想确保只在需要时执行我的observable的查询。换句话说,例如,如果obs1产生的数量超过N,那么obs2后面的查询就不会运行等等。
如果我使用concat:Observable(obs1,obs2,obs3,...)。concat,所有查询都可以在mongodb中并行运行
基本上,我正在寻找像obs1.switchIfX(obs2).switchIfX(obs3).....
这样的操作其中X:当前可观察的物品发射的物品少于N个。
知道如何以rxscala风格实现此要求吗?
答案 0 :(得分:2)
您可以尝试这样的事情(未经测试):
Observable.just(obs1, obs2, obs3).flatten(maxConcurrent=1).take(N)
maxConcurrent
参数确保flatten
一次仅订阅一个observable,并且一旦发出N
项,take
将取消订阅上游可观察对象,因此,如果此时尚未订阅obs2
或obs3
,则根据需要永远不会运行它们。
答案 1 :(得分:0)
您可以将来自源的项目收集到列表中,在Console.WriteLine(s[1]);
运算符中检查其大小,如果长度不够,则切换到另一个源:
flatMap
如果您不想获得超过N个项目,则可以指定@Test
public void test() {
Observable.range(1, 5)
.compose(switchIfFewer(Observable.range(1, 8), 10))
.compose(switchIfFewer(Observable.range(1, 15), 10))
.test()
.assertResult(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
}
static <T> ObservableTransformer<T, T> switchIfFewer(Observable<T> other, int n) {
return o -> {
return o.toList()
.flatMapObservable(list -> {
if (list.size() < n) {
return other;
}
return Observable.fromIterable(list);
});
};
}
。