【发布时间】:2016-02-12 17:04:59
【问题描述】:
这里是 Couchbase 新手,使用 Couchbase Server v4.0.0 和 Java SDK v2.2.3。我有以下代码用于运行查询
Observable
.defer(new Func0<Observable<AsyncN1qlQueryResult>>() {
@Override
public Observable<AsyncN1qlQueryResult> call() {
return bucket.async().query(query);
}
})
.flatMap(new Func1<AsyncN1qlQueryResult, Observable<AsyncN1qlQueryRow>>() {
@Override
public Observable<AsyncN1qlQueryRow> call(AsyncN1qlQueryResult result) {
return result.rows();
}
})
.map(new Func1<AsyncN1qlQueryRow, JsonObject>() {
@Override
public JsonObject call(AsyncN1qlQueryRow row) {
return row.value();
}
})
.toList()
.toBlocking()
.firstOrDefault(null);
query 预计会返回两个结果,我可以保证它没有任何问题。但是,如果我让它运行,这个表达式的计算结果为 null。我怀疑我切换到阻塞 observables 的方式或者延迟可能有问题。
一个有趣的观察是,如果我在调试模式下运行它并在return bucket.async().query(query); 行设置断点并每次使用调试器跳过它,我总是会得到一个包含 2 个元素的列表。 (只是另一个证明查询不是罪魁祸首的证据。)
有人能看出我的习语有什么问题吗?
【问题讨论】:
-
可以用
doOnNext打印每一步的结果吗? -
我看不出代码有什么问题,除了在 2.2.x 中你真的不需要初始延迟。
-
如果您删除
firstOrDefault并返回一个列表,您会得到什么?你的清单是空的吗?还可以查看AsyncN1qlQueryResult对象的内部——您可以在N1qlMetrics对象中的flatMap访问有关您的结果的数据。
标签: java couchbase rx-java reactive-programming