我有一个方法可以调用2个服务来生成AsyncCallBacks
centroService.buscarCentroPorNombre(nombreCentroSeleccionado, new AsyncCallback<Centro>() {
@Override
public void onSuccess(Centro centro) {
cArticuloCentro.setIdCentro(centro.getIdCentro());
cArticuloCentro.setPrecio(Double.parseDouble(precioTextBox.getText()));
}
@Override
public void onFailure(Throwable caught) {
//do something
}
});
articuloService.buscarArticuloPorNombre(nombreArticuloSeleccionado, new AsyncCallback<Articulo>() { //se llama al sevivio para q busque el la base de datos la Entity por nombre
public void onSuccess(Articulo articulo) {
cArticuloCentro.setIdArticulo(articulo.getCod());
}
@Override
public void onFailure(Throwable caught) {
//do something
}
});
调用下一个方法时会出现问题 因为这些serviceCalls是在调用之前激活的异步方法,没有获得所需的数据。下一个方法是
save(){
articuloCentroService.saveArticuloCentro(cArticuloCentro, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
//do something
}
@Override
public void onSuccess(String result) {
Window.alert("saved");
}
});
}
请告诉我一种在asyncCallbacks完成后执行save()方法的方法 谢谢
答案 0 :(得分:0)
在纯java中,您需要同步线程,但在GWT中,始终只有一个线程在运行,因此您可以使用数组执行简单的同步逻辑:
final int[] sync = new int[1];
centroService.buscarCentroPorNombre(nombreCentroSeleccionado, new AsyncCallback<Centro>() {
@Override
public void onSuccess(Centro centro){
//...
if (++sync[0] == 2){
save();
}
}
@Override
public void onFailure(Throwable caught) {
//do something
}
});
articuloService.buscarArticuloPorNombre(nombreArticuloSeleccionado, new AsyncCallback<Articulo>() {
public void onSuccess(Articulo articulo) {
//...
if (++sync[0] == 2){
save();
}
}
@Override
public void onFailure(Throwable caught) {
//do something
}
});
说明:由于只有一个线程在运行,因此同步数组一次只能由一个线程更新。您无法控制首先完成哪个方法,但是当它们执行时,一次只能执行一个回调。同步数组只是一个可用于同步任意数量的异步调用的计数器。