在继续之前等待 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
。
我目前有以下相关代码片段:
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
。