如何制作和AsyncCallback在调用下一个方法之前传递数据

时间:2015-05-14 11:34:17

标签: for-loop gwt methods wait asynccallback

我有一个方法可以调用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()方法的方法 谢谢

1 个答案:

答案 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
    }
});

说明:由于只有一个线程在运行,因此同步数组一次只能由一个线程更新。您无法控制首先完成哪个方法,但是当它们执行时,一次只能执行一个回调。同步数组只是一个可用于同步任意数量的异步调用的计数器。