前等待的AsyncCallback目前,我有以下相关代码片段:继续
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;
}
});
}
}
这将导致“查看域”。当我点击这个时,字段GWT组件被加载并显示字段。目前所有的字段默认都是禁用的,即使checkIfFieldsAreEnabled()
在它之前完成。当我点击“隐藏字段”按钮(在上面的代码中没有显示),然后再次显示字段按钮,它确实有效。
原因?它不会等待AsyncCallback<Boolean>
的结果,所以有时它可以工作,有时它不会,这取决于异步调用的完成速度。我来自C#背景,可以使用async
/await
。当我搜索一个Java的等价物时,我遇到了this SO answer by Jon Skeet,它基本上表明Java中没有这样的事情。但是,这是从三年前开始的,所以我想知道自那以后有什么变化。
如果没有,有没有人知道我可以等待AsyncCallback<Boolean>
其中设置areFieldsEnabled
布尔?
答案解决了您的问题吗?如果不是,请你澄清一下吗? – Baz
@巴兹可惜没有。当我读到你的答案时,这是非常明显的,所以我这样实现它,但是这些字段最初仍然是禁用的。虽然我不完全确定问题是什么,目前的优先事项有所改变。这个问题仍然存在,但我们必须在不久的将来解决它,所以当我知道更多关于正在发生的事情时,我会通知你。 –
@Baz我不确定最近几天发生了什么变化,但是现在它在我和其他GWT项目中的其他特性/错误一起工作之后就可以工作了。由于您的解决方案确实是在Java中处理AsynCallback的正确方法,因此我已将它作为答案。 –