2016-02-12 2 views
1

Cookbase rookie здесь, используя Couchbase Server v4.0.0 и Java SDK v2.2.3. У меня есть следующий код для выполнения запросаКаков правильный способ использования toBlocking() в Couchbase Java SDK?

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, как ожидается, вернуть два результата, и я могу гарантировать, что нет ничего плохого с ним. Однако, если я позволю ему запустить, это выражение оценивается как null. Я подозреваю, что может быть что-то не так с тем, как я переключаюсь на блокировку наблюдаемых или, возможно, с отсрочкой.

Интересное замечание состоит в том, что если я запустил его в режиме отладки и установил точку останова в строке return bucket.async().query(query); и каждый раз перехожу на нее с помощью отладчика, я всегда получаю список из 2 элементов. (Еще одно доказательство того, что запрос не является виновником.)

Может ли кто-то заметить что-то не так с моей идиомой?

+0

Не могли бы вы использовать 'doOnNext' для печати результата каждого шага? – zsxwing

+2

Я не вижу ничего плохого в коде, за исключением того, что с 2.2.x вам действительно не нужен первоначальный отложенный. –

+0

Что вы получите, если вы удалите 'firstOrDefault' и вернете список? Ваш список пуст? Также загляните внутрь объекта «AsyncN1qlQueryResult» - вы можете «flatMap» в объекте «N1qlMetrics» и получить доступ к данным о вашем результате. – Will

ответ

0

Хотя я не знаю вашего N1QL, проверьте следующее:

  1. Вы не должны начинать с Observable.defer(); просто начните с asyncBucket.query(), так как asyncBucket.query(q) или syncBucket.async().query(q) уже реализованы с отложенным способом.
  2. singleOrDefault() применимо при использовании с toList(). (Но, вероятно, это не имеет значения в этом случае.)
Смежные вопросы