繁体   English   中英

在继续之前等待AsyncCallback

[英]Wait for AsyncCallback before continuing

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

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等价物时,我遇到了Jon Skeet的这个答案 ,基本上说Java中没有这样的东西。 这是差不多三年前的事情,所以我想知道从那以后有什么变化。

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

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

如果您只想在回调返回后执行某些操作,请从回调的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM