Java 在另一个内部调用回调

Java 在另一个内部调用回调,java,gwt,Java,Gwt,您能建议我,在调用成功后,如何调用第一个AsyncCallback的内部,第二个AsyncyCallback?我使用gwt rpc并将数据加载到ui中,在调用成功时的第一个AsyncCallback方法后,我必须调用另一个AsyncCallback,以执行第一个AsyncCallback的下一部分,并将数据从db加载到ui中: void show(int last) { AsyncCallback<List<C>> callback = new AsyncCal

您能建议我,在调用成功后,如何调用第一个AsyncCallback的内部,第二个AsyncyCallback?我使用gwt rpc并将数据加载到ui中,在调用成功时的第一个AsyncCallback方法后,我必须调用另一个AsyncCallback,以执行第一个AsyncCallback的下一部分,并将数据从db加载到ui中:

void show(int last) {

    AsyncCallback<List<C>> callback = new AsyncCallback<List<C>>() {


        public void onFailure(Throwable caught) {

        }

        public void onSuccess(List<C> result) {


            panelCharts.clear();
            for (C c : result) {

                first = new Chart()
                        .setType(Series.Type.SPLINE)
                        .setSizeToMatchContainer()

                        .setLegend(
                                new Legend()
                                        .setLayout(Legend.Layout.VERTICAL)
                                        .setAlign(Legend.Align.RIGHT)
                                        .setVerticalAlign(
                                                Legend.VerticalAlign.TOP)
                                        .setX(-10).setY(100)
                                        .setBorderWidth(0))
                        .setZoomType(Chart.ZoomType.X_AND_Y);
                first.setStyleName("chart");

                Series series = first
                        .createSeries()
                        .setName("Summer")
                        .setPoints(
                                new Number[] { 7.0, 6.9, 9.5, 14.5, 18.4,
                                        21.5, 25.2, 26.5, 23.3, 18.3, 13.9,
                                        9.6 });
                first.setCredits(new Credits().setEnabled(false));
                first.addSeries(series);

                first.setChartTitleText(c.getName());



                AsyncCallback<List<M>> callbackA = new AsyncCallback<List<M>>() {
                    public void onFailure(Throwable caught) {

                    }

                    public void onSuccess(List<M> result) {


                        for (M m : result) {
                            Series serie = firstChart.createSeries().setName(
                                    m.getDName());

                            first.addSeries(serie);
                     }

                    }


                };

                rpcService.getKList(ID, callbackA);
                panelCharts.add(first);
            }
            }


    };
    rpcService.getList(last, callback);
void显示(int-last){
AsyncCallback callback=新的AsyncCallback(){
失败时的公共无效(可丢弃){
}
成功时公开作废(列表结果){
面板图;
对于(C:结果){
第一个=新图表()
.setType(系列.Type.SPLINE)
.setSizeToMatchContainer()
.setLegend(
新传奇()
.setLayout(图例.布局.垂直)
.setAlign(图例.Align.RIGHT)
白蜡木(
图例。垂直对齐。顶部)
.setX(-10).setY(100)
.1(宽度(0))
.setZoomType(Chart.ZoomType.X_和Y);
第一,名称(“图表”);
系列=第一个
.createSeries()
.setName(“夏季”)
.设定点(
新数字【】{7.0,6.9,9.5,14.5,18.4,
21.5, 25.2, 26.5, 23.3, 18.3, 13.9,
9.6 });
首先.setCredits(new Credits().setEnabled(false));
第一,添加系列(系列);
首先,setChartTitleText(c.getName());
AsyncCallback callbackA=新的AsyncCallback(){
失败时的公共无效(可丢弃){
}
成功时公开作废(列表结果){
for(M:结果){
Series serie=firstChart.createSeries().setName(
m、 getDName());
第一,addSeries(serie);
}
}
};
getKList(ID,callbackA);
小组图。添加(第一);
}
}
};
rpcService.getList(最后一个,回调);

}

如果我看得正确,您正在for循环中执行第二个异步RPC。 在我看来,这不是一个好主意

请记住,RPC调用是异步的,这意味着它们不会阻止脚本的执行。 您的代码可能会运行整个for循环,并在第一个内部RPC调用返回之前将所有视图元素添加到“panelCharts”。内部RPC调用返回的顺序也没有保证

private void iterateElements(Iterator<C> iter){
 /*** ALL THE OTHER STUFF ***/
 AsyncCallback<List<M>> callbackA = new AsyncCallback<List<M>>() {
   public void onFailure(Throwable caught) {
   }
   public void onSuccess(List<M> result) {
      /*** ALL THE OTHER STUFF ***/
      // Add view
      panelCharts.add(first);
      //If next element, do next!
      if(iter.hasNext()){
        iterateElements(iter.next());
      }
    }
  });
}
private void迭代器元素(迭代器iter){
/***所有其他的东西***/
AsyncCallback callbackA=新的AsyncCallback(){
失败时的公共无效(可丢弃){
}
成功时公开作废(列表结果){
/***所有其他的东西***/
//添加视图
小组图。添加(第一);
//如果是下一个元素,请执行下一步!
if(iter.hasNext()){
迭代元素(iter.next());
}
}
});
}

我的建议是在一个额外的方法中使用迭代器对列表进行迭代,就像这样。查看如何仅在返回当前元素的RPC调用后请求下一个元素。这样可以保证顺序,并且只有在所有数据都可用的情况下,才可以将小部件添加到视图中。

上面的代码中到底有什么不起作用?第一个onsuccess工作,我得到数据,但第二个异步onsuccess不起作用。您是否遇到异常?可能会调用
onFailure
。从代码本身来看,它应该可以工作