[英]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.