在继续之前等待 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;
            }
        });
    }
}

这会产生一个按钮 "Show fields"。当我单击它时,会加载 Fields GWT 组件并显示字段。目前所有字段默认情况下都是禁用的,即使 checkIfFieldsAreEnabled() 是在它之前完成的。当我单击 "Hide fields" 按钮(上面的代码中未显示),然后再次单击 "Show fields" 按钮时,它确实起作用了。

原因?它不等待 AsyncCallback<Boolean> 的结果,因此有时它会工作,有时不会,这取决于异步调用的完成速度。我来自可以使用 async/await 的 C# 背景。当我用谷歌搜索 Java 等价物时,我遇到了 this SO answer by Jon Skeet,它基本上表明 Java 中没有这样的东西。然而,这是大约三年前的事了,所以我想知道从那时起是否有任何变化。

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

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

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