我需要进行几个 api 调用(顺序、异步),其中一些返回列表。我的api接口如下。
@GET("/users/settings")
Observable<UserWrapper> getUserSettings();
@GET("/{username}/collections")
Observable<List<Item>> getItems(@Path("username") String userName);
@GET("/item/{id}")
Observable<ItemInfo> getItemInfo(@Path("id") int id);
@GET("/{username}/friends")
Observable<List<Friend>> getFriends(@Path("username") String userName);
这是我想要按顺序执行的操作:
- Get
UserWrapper
通过致电getUserSettings()
- 通过调用保存用户
saveUser(userWrapper)
- 通过调用获取用户的物品
getItems(userWrapper.getUserName())
- 通过调用获取每个项目的信息
getItemInfo(item.getId())
- 保存每个
itemInfo
通过致电saveItem(itemInfo)
- 通过拨打电话的方式获取用户的好友
getFriends(userWrapper.getUserName())
- 拨打电话拯救每一位朋友
saveFriend(friend)
现在我是 RxJava 的新手,不知道如何处理列表。我看了其中一部杰克·沃顿的幻灯片 https://speakerdeck.com/jakewharton/2014-1发现他使用了一个函数flattenList()
但我不知道它的定义。如果您能帮助编写这个链,那就太好了。
Update 1
这是我现在得到的:
mApiService.getUserSettings()
.map(this::saveUser)
.flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()));
.flatMapIterable( ? "How to iterate for each item" ? );
Update 2
我正在尝试写这样的东西
mApiService.getUserSettings()
.map(this::saveUser)
.flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()))
.someMethodToIterateThroughEachItem(item -> mApiService.getItemInfo(item))
.map(this::saveItem)
.someMethodThatCanCallUserWrapperAgain(userWrapper -> mApiService.getFriends(userWrapper.getUserName()))
.someMethodToIterateThoughEachFriend(friend -> saveFriend(friend))
RxJava 已添加flatMapIterable
。所以你不需要flattenList
现在。例如。,
Observable<UserWrapper> o =
getUserSettings()
.doOnNext(this::saveUser)
.flatMap(user -> getItems(user.getUserName())
.flatMapIterable(items -> items)
.flatMap(item -> getItemInfo(item.getId()))
.doOnNext(this::saveItem)
.toList()
.map(ignored -> user))
.flatMap(user -> getFriends(user.getUserName())
.flatMapIterable(friends -> friends)
.doOnNext(this::saveFriend)
.toList()
.map(ignored -> user)
);
o.subscribe(...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)