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 элементов. (Еще одно доказательство того, что запрос не является виновником.)
Может ли кто-то заметить что-то не так с моей идиомой?
Не могли бы вы использовать 'doOnNext' для печати результата каждого шага? – zsxwing
Я не вижу ничего плохого в коде, за исключением того, что с 2.2.x вам действительно не нужен первоначальный отложенный. –
Что вы получите, если вы удалите 'firstOrDefault' и вернете список? Ваш список пуст? Также загляните внутрь объекта «AsyncN1qlQueryResult» - вы можете «flatMap» в объекте «N1qlMetrics» и получить доступ к данным о вашем результате. – Will