我对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次,并将一个事件的结果传递给另一个事件。