簡體   English   中英

在Couchbase Java SDK中使用toBlocking()的正確方法是什么?

[英]What's the right way to use toBlocking() in Couchbase Java SDK?

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應返回兩個結果,我可以保證它沒有任何問題。 但是,如果我讓它運行,則此表達式的值為空。 我懷疑我轉換為阻止可觀察對象的方式可能存在問題,或者可能是延遲。

一個有趣的觀察是,如果我在調試模式下運行它,並在return bucket.async().query(query);行的return bucket.async().query(query);處設置斷點return bucket.async().query(query); 每次使用調試器進行調試時,我總是得到一個包含2個元素的列表。 (這是查詢不是罪魁禍首的另一個證明。)

有人可以發現我的成語有什么毛病嗎?

盡管我不知道您的N1QL,請檢查以下內容:

  1. 您不應該從Observable.defer()開始; 只需從asyncBucket.query()開始,因為asyncBucket.query(q)syncBucket.async().query(q)已經以延遲方式實現。
  2. singleOrDefault()當用於相關toList() (但是,在這種情況下,可能沒有關系。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM