Как обрабатывать вложенные события в RX Java - PullRequest
0 голосов
/ 19 ноября 2018

Я новичок в 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 раз, а также передать результат одного событиядругим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...