2016-02-12 97 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()一起使用時是相關的。 (但是,在這種情況下可能並不重要。)
相關問題