在继续之前等待AsyncCallback

时间:2016-03-07 13:34:49

标签: java asynchronous gwt callback async-await

我目前有以下相关代码段:

public class MyEntryPoint implements EntryPoint {

    private boolean areFieldsEnabled = false;

    @Override
    public void onModuleLoad(){
        addFields();
    }

    private void addFields(){
        Button button = new Button("Show fields");
        button.addClickHandler(new ClickHandler(){

            @Override
            public void onClick(final ClickEvent event){
                String entityType = ...;
                String entityId = ...;
                checkIfFieldsAreEnabled();
                MyEntryPoint.this.fields = new FieldsValuesDiv(entityType, 
                    Long.valueOf(entityId), MyEntryPoint.this.areFieldsEnabled);
                wrapper.add(MyEntryPoint.this.fields);
            }
        });
    }

    private void checkIfFieldsAreEnabled(){
        this.fieldsService.areValuesEditable(new AsyncCallback<Boolean>(){

            @Override
            public void onFailure(final Throwable caught){
                Window.alert(caught.getLocalizedMessage());
            }

            @Override
            public void onSuccess(final Boolean result){
                MyEntryPoint.this.areFieldsEnabled = result;
            }
        });
    }
}

这会产生一个“显示字段”按钮。单击此按钮时,将加载Fields GWT组件并显示字段。目前,默认情况下禁用所有字段,即使checkIfFieldsAreEnabled()正好在它之前完成。当我单击“隐藏字段”按钮(上面的代码中未显示),然后再次单击“显示字段”按钮时,它确实有效。

原因?它不等待AsyncCallback<Boolean>的结果,所以有时它确实有效,有时它不起作用,这取决于异步调用的执行速度。我来自C#背景,可以使用async / await。当我搜索Java等价物时,我遇到了this SO answer by Jon Skeet,这基本上说明Java中没有这样的东西。这是差不多三年前的事情,所以我想知道从那以后发生了什么变化。

如果没有,是否有人知道如何等待设置AsyncCallback<Boolean>布尔值的areFieldsEnabled

1 个答案:

答案 0 :(得分:3)

回调是异步运行的,这意味着在回调仍然从服务器获取数据时执行其他代码(调用后的行)。

如果您只想在回调返回后执行某些操作,请从回调的onSuccess方法中调用它:

this.fieldsService.areValuesEditable(new AsyncCallback<Boolean>(){

    @Override
    public void onFailure(final Throwable caught){
        Window.alert(caught.getLocalizedMessage());
    }

    @Override
    public void onSuccess(final Boolean result){
        MyEntryPoint.this.areFieldsEnabled = result;
        // Do whatever needs to be done here
        MyEntryPoint.this.fields = new FieldsValuesDiv(entityType, Long.valueOf(entityId), MyEntryPoint.this.areFieldsEnabled);
        wrapper.add(MyEntryPoint.this.fields);
    }
});

这将确保在您尝试访问areFieldsEnabled之前设置`ssh $1@$2 > /etc/kafka/kafka_2.11-0.9.0.0/config/test.sh <<EOL broker.id=$3 listeners=$4 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 log.dirs=/tmp/kafka-logs num.partitions=1 num.recovery.threads.per.data.dir=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 log.cleaner.enable=false zookeeper.connection.timeout.ms=6000 delete.topic.enable=true ssl.client.auth=required security.inter.broker.protocol=SSL EOL`