如何避免Java中的回调地狱?
我有一个带有api调用序列的java应用程序(我正在使用改型)。目前看起来像金字塔:如何避免Java中的回调地狱?,java,Java,我有一个带有api调用序列的java应用程序(我正在使用改型)。目前看起来像金字塔: mApi.login(request, new Callback<LoginResponse>() { @Override public void success(LoginResponse s, Response response) { mApi.getRoutes(request, new Callback<RoutesResponse>() { @
mApi.login(request, new Callback<LoginResponse>() {
@Override
public void success(LoginResponse s, Response response) {
mApi.getRoutes(request, new Callback<RoutesResponse>() {
@Override
public void success(RoutesResponses, Response response) {
...
}
@Override
public void failure(RetrofitError error) {}
}
}
@Override
public void failure(RetrofitError error) {}
});
mApi.login(请求,新回调(){
@凌驾
public void成功(登录响应、响应){
mApi.getRoutes(请求,新回调(){
@凌驾
公共无效成功(路由响应、响应){
...
}
@凌驾
公共无效失败(错误){}
}
}
@凌驾
公共无效失败(错误){}
});
有一些库可以避免回调地狱吗?比如javascript中的TwoStep或Q。只要您只对API调用进行排序,就可以通过使用Observable而不是回调并将它们与Rx流支持结合在一起,来使用Reformation的RxJava支持。我主要使用.flatmap()函数将一个API调用的结果转换为另一个API调用的结果。在您的情况下,它将如下所示: 首先,我将使用调用的可观察版本,而不是带有回调的版本,这将是:
Observable<LoginResponse> login(loginRequest);
Observable<RoutesResponse> getRoutes(routesRequest);
可观察登录(loginRequest);
可观察的getRoutes(RouteRequest);
在我们的API中有了这两个函数之后,我们可以将它们与RxJava流绑定在一起。下面是一个没有错误检查的函数,我正在编写它,以作为一个快速示例:
public Observable<RoutesResponse> rxGetRoutes(loginRequest, routesRequest) {
final YourAPI mAPI = YourApiProvider.getInstance();
return mAPI.login(loginRequest)
//using flatmap to convert one answer to another answer
.flatmap( (Func1) LoginResponse -> {
return mAPI.getRoutes(routesRequest);
});
}
公共可观察rxGetRoutes(loginRequest、RouteRequest){
final YourAPI mAPI=YourApiProvider.getInstance();
返回mAPI.login(loginRequest)
//使用flatmap将一个答案转换为另一个答案
.flatmap((功能1)登录响应->{
返回mAPI.getRoutes(RouteRequest);
});
}
在学习了一点RxJava之后,您现在可以正常地观察并订阅此函数返回的Observable:
rxGetRoutes(loginReq, routesReq)
.observeOn(//the thread you want to observe on)
.subscribe( new Subscriber<RoutesResult>() {
@Override
//the functions of Subscriber you need to override
//where you can also check for errors
//Check RxJava documentation after your IDE completes this area.
});
rxGetRoutes(loginReq、routesReq)
.observeOn(//要在其上观察的线程)
.subscribe(新订户(){
@凌驾
//您需要覆盖的订阅服务器的功能
//您还可以在其中检查错误
//IDE完成此区域后,请检查RxJava文档。
});
使用lambda表达式将摆脱这种回调地狱。但是,由于回调
接口由两个抽象方法组成,您不能直接使用lambda。这就是RxJava的用武之地。RxJava引入了更多的函数方式,使您能够使用函数接口,在这些接口中可以使用lambda来减少c奥尔巴克地狱
RxJava是ReactiveX(反应式扩展)的Java VM实现:
一个库,用于使用
可观测序列
下面是一些关于RxJava和lambda的参考资料
只是不要堆叠内部类并为每个步骤使用方法?或者使用事件机制。您的前两个链接@bhdrkn已断开。请解决。谢谢。