Цепные асинхронные методы в цикле с RxJava - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть этот код, и я хочу знать, возможно ли это с RxJava:

  • Функция запрашивает пользователя с сервера (асинхронно)
  • Сервер возвращает пользователяJSON-объект со списком идентификаторов связанных UserProfile
  • Затем для каждого из этого идентификатора необходимо извлечь UserProfile с заданным идентификатором (также асинхронно)
  • Для каждого асинхронно выбранного UserProfileдобавьте его к объекту User, ниже мой псевдокод.
  • Я не могу использовать любой код блокировки, все запросы должны быть асинхронными.

Вот код:

@Override
public Single<User> retrieve(String entityId) {
    BaasUser baasUser = new BaasUser();
    baasUser.setEntityId(entityId);
    baasUser.setIncludes(Arrays.asList("userProfile"));
    return baasUser.retrieve().map(user -> {
        String username = user.getUsername();
        String dateCreated = user.getDateCreated();
        String dateUpdated = user.getDateUpdated();

        List<UserProfile> userProfiles = new LinkedList<>();

        BaasLink userProfileLink = user.getFirstLink();
        userProfileLink.getEntities().forEach(stubEntity -> {
            Single<UserProfile> observable = stubEntity.retrieve().map(entity -> {
                UserProfile userProfile = new UserProfile();
                userProfile.setEntityId(entity.getStringProperty("entityId"));
                userProfile.setName(entity.getStringProperty("name"));
                return userProfile;
            });
            observable.subscribe(userProfile -> {
                // until all UserProfile is fetched this 'retrieve' "callback" should not return
                userProfiles.add(userProfile);
            }, error -> {
               // err
            });
        });
        User user1 = new User();
        user1.setDateCreated(dateCreated);  
        user1.setDateUpdated(dateUpdated);  
        user1.setUsername(username);
        user1.setUserProfiles(userProfiles);
        return user1;
    });
}

1 Ответ

0 голосов
/ 21 декабря 2018

Здесь у вас есть пример того, как сделать свою работу, возможно, есть какая-либо ошибка типа, потому что у меня нет ваших объектов

    Single.just("user")
            .observeOn(Schedulers.io())
            .flatMap(user -> Observable.zip(getCurrentUserData(user),getUserProfiles(user),(t1, t2) -> {
                //first func will return user eith some data next function wll return List<UserProfile> userProfiles
                return newuser;
            }))
            .subscribeOn(Schedulers.io())
}

private Single<List<UserProfile>> getUserProfiles(User user) {
    Observable.fromIterable( user.getFirstLink().getEntities())
            .flatMap(stubEntity ->stubEntity.retrieve())
            .map(o -> {
                //set user profile data
                return userprofile
            })
            .toList();


}

private Single<User> getCurrentUserData(User user) {
    Observable.just(user)
            .map(s -> {
                //set data
                return user;
            })
}
...