Я новичок в RX Java и столкнулся с проблемой.Там, где у меня есть наборы событий, и вывод одного события должен подаваться как ввод другого события, и может быть n событий.Я пытался сделать это следующим образом.
public Single<List<EventMetaData>> executeAction(Long blogId){
Single<BlogPostData> dbblogPostData = manager.findById(blogId);
Single<BlogPostData> chain = dbblogPostData;
List<Single<BlogPostData>> allBlogPost = new ArrayList<>();
allSnapshots.add(dbblogPostData);
for (EventEntry eventEntry : Events) {
// create a chain where response of one event is passed to next event
chain = chain.flatMap(blogPostData -> {
Single<BlogPostData> newSnapshot = executeEvent(eventEntry, blogPostData);
return newSnapshot;
});
allBlogPost.add(chain);
}
return Single.zip(allBlogPost, objects -> {
List<blogPostData> snapshotEntries = new ArrayList<>();
for (Object obj : objects) {
snapshotEntries.add((blogPostData) obj);
}
return getMetaData(snapshotEntries);
});
}
private Single<BlogPostData> executeEvent(Event event, BlogPostData blogpostEntry) throws ManagerException {
Single<BlogPostData> clientSnapshotSingle =
facade.getSnpashotFromClient(blogpostEntry, event);
return clientSnapshotSingle.flatMap(
blogPost -> {
// Do some logic here on get new Snapshot, that needs to be save it to DB
blogpostEntry = utils.getDBUpdatableData(blogpostEntry, event.getRefId);
if (event.isDbupdatable) {
// This methods returns Single<BlogPostData>
return manager.create(blogpostEntry);
}
return Single.just(blogpostEntry);
});
}
Теперь, если у меня есть два события, скажем, e1, e2.Этот код
chain.flatMap(blogPostData -> { Single<BlogPostData> newSnapshot = executeEvent(eventEntry, blogPostData);
return newSnapshot;}
выполняется 3 раза (дважды для события e1 и один раз для e2). Когда я подписываюсь так, как это. И для 4 событий он будет полностью 6 раз.
Single<List<EventMetaData>> listOfMeta;
(listOfMeta.subscribe());
Чтобы упростить мой пример.Когда executeAction вызывается, я беру запись в блоге из БД, а затем запускаю набор событий (через вызов executeEvent ()).Теперь, поскольку все события являются последовательными, мне нужно передать выходные данные первого события на вход вторых событий и так далее.Я также сохраняю все выходные данные событий в Списке List<Single> allBlogPost
, чтобы выполнить некоторые вычисления над ним Single.zip(allBlogPost)
.
Так может кто-нибудь помочь мне выяснить, что не так с моим кодом, и как я могу точно выполнить все события (если я должен использовать любой другой оператор) n раз, а также передать результат одного событиядругим.