如何避免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>() { @

我有一个带有api调用序列的java应用程序(我正在使用改型)。目前看起来像金字塔:

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已断开。请解决。谢谢。