我是Rx的新手,我正在尝试创建一个Observable:
我有这个:
public Observable<List<City>> getCities() {
authService.requestToken() //return Observable<String>
.concatMap(new Func1<String, Observable<? extends List<City>>>() {
@Override
public Observable<? extends List<City>> call(String token) {
CitiesRequest request = new CitiesRequest(token);
return soapClient.consume(request).map(new CityResponseParseFunc()); }
})
//Here, I need close the session using the token. Maybe with doOnCompleted?
}
我不知道它是否正确,不知道如何继续。请注意,我需要该方法返回Observable<List<City>>
。这可能吗?
感谢。任何帮助将不胜感激。
答案 0 :(得分:1)
如果requestToken()
只发出一个值,您可以为concatMap
切换flatMap
并使用此重载版本:
authService.requestToken() //return Observable<String>
.flatMap(new Func1<String, Observable<? extends List<City>>>() {
@Override
public Observable<? extends List<Integer>> call(String token) {
CitiesRequest request = new CitiesRequest(token);
return soapClient.consume(request).map(new CityResponseParseFunc());
}
}, new Func2<String, List<City>, List<City>>() {
@Override
public List<City> call(String token, List<City> cities) {
authService.closeSession(token)
return cities; /*close session with token*/
}
})
答案 1 :(得分:1)
您可以使用using
运算符。它需要3个函数作为参数:
Func0<Resource>
(此处为令牌)。Func1<Resource, Observable<T>>
创建Observable<T>
,使用资源(此处为我们的城市列表的Observable)。Action1<Resource>
,它将在Observable<T>
生命周期结束时处置资源。由于您的authService
似乎返回Observable<String>
,因此它可以使using
运算符的使用稍微复杂一些,特别是对于dispose函数(需要缓存资源{{ 1}}以便订阅它的dispose函数不会重新生成令牌。另一种方法是同步获取令牌。
这样的事情:
Observable<String>