你可以建议我,在调用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);
}
答案 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调用后请求下一个元素。这样就可以保证订单,只有在所有数据都可用时才将窗口小部件添加到视图中。