前等待的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的正確方法,因此我已將它作爲答案。 –