У меня есть три метода
1) Получить шаблон
2) Получить поле (идентификатор шаблона)
3) Получить метаданные поля (идентификатор поля)
Порядок вызова методов сверху вниз.Метод getTemplate () возвращает один шаблон.Основываясь на ответе, я вызываю второй метод, чтобы получить связанные с ним поля.Я получаю несколько полей против шаблона.Я перебираю поля и ищу метаданные полей.Каждое поле имеет метаданные.
Проблема, с которой я сталкиваюсь, заключается в том, что мой метод возвращает один шаблон и только один поданный.Я не перебираю другие поля.Причина, по которой я вижу это то, как я обращаюсь с обработчиком.Каков наилучший способ обработки обработчика, когда мы имеем ситуацию с вложенным циклом.
Вот мой код,
Первый метод
public Single<Template> getByName(String lookupName) {
return new AsyncResultSingle<Template>(resultHandler -> {
jdbcClient.rxGetConnection().subscribe(connection -> {
String sql = "SELECT * FROM template t WHERE t.name=?";
JsonArray params = new JsonArray().add(lookupName);
connection.rxQueryWithParams(sql, params).subscribe(resultSet -> {
List<JsonObject> rows = resultSet.getRows();
Template template = new Template();
for (JsonObject jsonObject : rows) {
template.id = jsonObject.getInteger("id");
template.name = jsonObject.getString("name", "");
template.column = jsonObject.getInteger("columns", -1);
Single<Map<Integer, TemplateField>> rxFields = templateFieldDao.getAllFields(template);
rxFields.subscribe(fields -> {
template.fields = fields;
resultHandler.handle(Future.succeededFuture(template));
}, failure -> {
resultHandler.handle(Future.failedFuture(failure));
});
}
}, onError -> {
resultHandler.handle(Future.failedFuture(onError));
});
}, onError -> {
resultHandler.handle(Future.failedFuture(onError));
});
});
}
Второй метод
public Single<Map<Integer, TemplateField>> getAllFields(Template template) {
return new AsyncResultSingle<Map<Integer, TemplateField>>(resultHandler -> {
jdbcClient.rxGetConnection().subscribe(connection -> {
String sql = "SELECT * from template_field as f where f.template_id=?";
JsonArray params = new JsonArray().add(template.id);
connection.rxQueryWithParams(sql, params).subscribe(resultSet -> {
Map<Integer, TemplateField> templateFieldMap = new HashMap<Integer, TemplateField>();
List<JsonObject> rows = resultSet.getRows();
for (JsonObject jsonObject : rows) {
TemplateField templateField = new TemplateField();
templateField.id = jsonObject.getInteger("id");
templateField.name = jsonObject.getString("name");
templateField.order = jsonObject.getInteger("sort_order");
templateField.column_id = jsonObject.getInteger("column_id");
templateField.template_id = jsonObject.getInteger("template_id");
Single<Map<Integer, Metadata>> rxMetaData = metadata.getByFieldId(templateField);
rxMetaData.subscribe(fieldMetadata -> {
templateField.metadata = fieldMetadata;
templateFieldMap.put(templateField.id, templateField);
resultHandler.handle(Future.succeededFuture(templateFieldMap));
}, failure -> {
resultHandler.handle(Future.failedFuture(failure));
});
}
}, onError -> {
resultHandler.handle(Future.failedFuture(onError));
});
}, onError -> {
resultHandler.handle(Future.failedFuture(onError));
});
});
}
Третий метод
public Single<Map<Integer, Metadata>> getByFieldId(TemplateField field) {
return new AsyncResultSingle<Map<Integer, Metadata>>(resultHandler -> {
jdbcClient.rxGetConnection().subscribe(connection -> {
String sql = "SELECT m.id as id, m.name as name, m.value as value, m.isProperty as isValue FROM template_field_metadata as m WHERE m.template_field_id=?";
JsonArray params = new JsonArray().add(field.id);
Map<Integer, Metadata> metadataMap = new HashMap<Integer, Metadata>();
connection.rxQueryWithParams(sql, params).subscribe(resultSet -> {
List<JsonObject> rows = resultSet.getRows();
for (JsonObject object : rows) {
Metadata metadata = new Metadata();
metadata.id = object.getInteger("id");
metadata.name = object.getString("name");
metadata.value = object.getString("value");
metadata.isValue = object.getBoolean("isValue");
metadataMap.put(metadata.id, metadata);
}
resultHandler.handle(Future.succeededFuture(metadataMap));
}, onError -> {
resultHandler.handle(Future.failedFuture(onError));
});
}, onError -> {
resultHandler.handle(Future.failedFuture(onError));
});
});
Я думаю, что время, когда я отправляю Future.succeeded () назад.Моя программа посчитала, что запрос был выполнен.Любая помощь будет оценена.
Спасибо,
Я разместил этот вопрос в группе Google Vertx Dev.Посмотрим, ответит ли кто-нибудь там .