什么';在Couchbase Java SDK中使用toblock()的正确方法是什么?

什么';在Couchbase Java SDK中使用toblock()的正确方法是什么?,java,couchbase,rx-java,reactive-programming,Java,Couchbase,Rx Java,Reactive Programming,Couchbase新手,使用Couchbase服务器v4.0.0和JavaSDK v2.2.3。我有以下运行查询的代码 Observable .defer(new Func0<Observable<AsyncN1qlQueryResult>>() { @Override public Observable<AsyncN1qlQueryResult> call() {

Couchbase新手,使用Couchbase服务器v4.0.0和JavaSDK 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);
可观察
.defer(新函数0(){
@凌驾
公共可观测呼叫(){
返回bucket.async().query(查询);
}
})
.flatMap(新函数1(){
@凌驾
公共可观察调用(AsyncN1qlQueryResult结果){
返回result.rows();
}
})
.map(新函数1(){
@凌驾
公共JsonObject调用(AsyncN1qlQueryRow行){
返回row.value();
}
})
托利斯先生()
.toBlocking()
.firstOrDefault(空);
查询
将返回两个结果,我可以保证它没有问题。但是,如果让它运行,则该表达式的计算结果为null。我怀疑我切换到阻塞观测值的方式可能有问题,或者可能是延迟了

一个有趣的观察结果是,如果我在调试模式下运行它,并在
return bucket.async().query(query)行设置一个断点

有人能发现我的习惯用法有什么错误吗?

虽然我不知道你的N1QL,但请检查以下内容:

  • 您不应该以
    Observable.defer()开头;只需从
    asyncBucket.query()
    开始,因为
    asyncBucket.query(q)
    syncBucket.async().query(q)
    已经以延迟方式实现
  • singleOrDefault()
    toList()一起使用时相关。(但在这种情况下,这可能无关紧要。)

  • 虽然我不知道您的N1QL,但请检查以下内容:

  • 您不应该以
    Observable.defer()开头;只需从
    asyncBucket.query()
    开始,因为
    asyncBucket.query(q)
    syncBucket.async().query(q)
    已经以延迟方式实现
  • singleOrDefault()
    toList()一起使用时相关。(但在这种情况下,这可能无关紧要。)

  • 你能用
    doOnNext
    打印每个步骤的结果吗?我看不出代码有什么问题,除了2.2.x你不需要初始延迟。如果你删除
    firstOrDefault
    并返回一个列表,你会得到什么?你的名单是空的吗?还可以查看
    AsyncN1qlQueryResult
    对象内部-您可以在
    N1qlMetrics
    对象中查看
    flatMap
    ,并访问有关结果的数据。是否可以使用
    doOnNext
    打印每个步骤的结果?我看不出代码有任何错误,除了在2.2.x中,您实际上不需要初始延迟。如果删除
    firstOrDefault
    并返回一个列表,您会得到什么?你的名单是空的吗?还可以查看
    AsyncN1qlQueryResult
    对象内部-您可以在
    N1qlMetrics
    对象中查看
    flatMap
    ,并访问有关结果的数据。