1

Couchbase ビューから非同期データを取得するコードを作成しました。

これは実装クラスです

AsyncViewResult viewResult = 
    offerCouchDao.findViewResultAsync(DDN, VIEWNAME).toBlocking().single();
if (viewResult.success()) {
    Observable<JsonArray> JAoffer =
        offerCouchDao.getAsyncJsonObject(viewResult.rows());
    Object response = offerCouchDao.getData(JAoffer);
    System.out.println("Data is "+response);
        return new OfferResponse(true,"Offer Data",response).toJson();
}

これはOfferCouchDaoです:

public Observable<AsyncViewResult> findViewResultAsync(String ddn, String viewname) {
    ViewQuery allResult = ViewQuery.from(ddn, viewname);
    return couchbaseManager.getMobikwikBucket().async().query(allResult);
}

public Observable<JsonArray> getAsyncJsonObject(Observable<AsyncViewRow> viewResult) {
    return viewResult.
            //extract the document from the row and carve a result object using its content and id
                    flatMap(new Func1<AsyncViewRow, Observable<JsonObject>>() {
                @Override
                public Observable<JsonObject> call(AsyncViewRow row) {
                    return row.document().map(new Func1<JsonDocument, JsonObject>() {
                        @Override
                        public JsonObject call(JsonDocument jsonDocument) {
                            return JsonObject.create()
                                    .put("id", jsonDocument.id())
                                    ;
                        }
                    })
                            ;
                }
            }).filter(new Func1<JsonObject, Boolean>() {
        @Override
        public Boolean call(JsonObject jsonObject) {
            String name = jsonObject.getString("name");
            return name != null ;
        }
    })


            .collect(new Func0<JsonArray>() { //this creates the array (once)
                @Override
                public JsonArray call() {
                    return JsonArray.empty();
                }
            }, new Action2<JsonArray, JsonObject>() { //this populates the array (each item)
                @Override
                public void call(JsonArray objects, JsonObject jsonObject) {
                    objects.add(jsonObject);
                }
            });
}

public Object getData(Observable<JsonArray> jsonArraay) {
    return jsonArraay
    .map(new Func1<JsonArray, JsonArray>() {
        @Override
        public JsonArray call(JsonArray objects) {
            return objects;
        }
    })
            .onErrorReturn(new Func1<Throwable, JsonArray>() {
                @Override
                public JsonArray call(Throwable throwable) {
                    return null;
                }
            })
            .toBlocking().single();
}

私が抱えている問題は、返されたデータがnullであることです

ログは次のとおりです。

Data is []
Data is null

また、次の同期呼び出しを介して行う場合:

    else {
        JsonArray keys = JsonArray.create();
        Iterator<ViewRow> iter = viewResult.rows();
        while (iter.hasNext()) {
            ViewRow row = iter.next();
            JsonObject beer = JsonObject.create();
            beer.put("name", row.key());
            beer.put("id", row.id());
            keys.add(beer);
       }
    }

期待どおりの応答が得られています。

誰かが私を助けることができますか?

4

0 に答える 0