在另一个内部调用回调

时间:2014-07-03 12:13:50

标签: java gwt

你可以建议我,在调用Success,第二个AsyncCyllback之后如何在第一个AsyncCallback内部调用?我使用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);

}

1 个答案:

答案 0 :(得分:0)

当我正确地看到你正在for循环中进行第二个异步RPC。 在我看来,这不是一个好主意。

请记住,RPC调用是异步的,这意味着它们不会阻止脚本的执行。 您的代码可能会遍历整个for循环并将所有视图元素添加到&#34; panelCharts&#34;在第一次内部RPC调用返回之前。内部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());
      }
    }
  });
}

我的建议是使用Iterator在这样的额外方法中迭代列表。看看我们如何在返回当前元素的RPC调用后请求下一个元素。这样就可以保证订单,只有在所有数据都可用时才将窗口小部件添加到视图中。