2016-02-12 91 views
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个元素的列表。 (只是另一个证明,查询不是罪魁祸首。)

有人可以发现我的成语有什么不对吗?

+0

您可以使用'doOnNext'打印每个步骤的结果吗? – zsxwing

+2

我可以看到代码没有错,除了2.2.x之外,你并不需要最初的延迟。 –

+0

如果你删除'firstOrDefault'并返回一个列表,你会得到什么?你的清单是空的吗?也可以在'AsyncN1qlQueryResult'对象的内部查看 - 你可以在'N1qlMetrics'对象的'flatMap'中访问关于结果的数据。 – Will

回答

0

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

  1. 你不应该Observable.defer()启动;从asyncBucket.query()开始,因为asyncBucket.query(q)syncBucket.async().query(q)已经以延迟方式实施。
  2. singleOrDefault()在与toList()一起使用时是相关的。 (但是,在这种情况下可能并不重要。)
相关问题