1
Couchbase菜鸟在这里,使用Couchbase Server v4.0.0和Java SDK v2.2.3。我有下面的代码运行一个查询什么是在Couchbase Java SDK中使用toBlocking()的正确方法?
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
预计将返回两个结果,我可以保证没有什么不妥的地方。但是,如果让它运行,则此表达式的计算结果为空。我怀疑可能会出现某些问题,例如阻止观察对象或延迟对象。
一个有趣的观察是,如果我在调试模式下运行它,并在行return bucket.async().query(query);
处设置一个断点并每次使用调试器跳过它,我总会得到一个包含2个元素的列表。 (只是另一个证明,查询不是罪魁祸首。)
有人可以发现我的成语有什么不对吗?
您可以使用'doOnNext'打印每个步骤的结果吗? – zsxwing
我可以看到代码没有错,除了2.2.x之外,你并不需要最初的延迟。 –
如果你删除'firstOrDefault'并返回一个列表,你会得到什么?你的清单是空的吗?也可以在'AsyncN1qlQueryResult'对象的内部查看 - 你可以在'N1qlMetrics'对象的'flatMap'中访问关于结果的数据。 – Will