繼續

2016-03-07 98 views
1

前等待的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布爾?

+0

答案解決了您的問題嗎?如果不是,請你澄清一下嗎? – Baz

+0

@巴茲可惜沒有。當我讀到你的答案時,這是非常明顯的,所以我這樣實現它,但是這些字段最初仍然是禁用的。雖然我不完全確定問題是什麼,目前的優先事項有所改變。這個問題仍然存在,但我們必須在不久的將來解決它,所以當我知道更多關於正在發生的事情時,我會通知你。 –

+0

@Baz我不確定最近幾天發生了什麼變化,但是現在它在我和其他GWT項目中的其他特性/錯誤一起工作之後就可以工作了。由於您的解決方案確實是在Java中處理AsynCallback的正確方法,因此我已將它作爲答案。 –

回答

3

回調是異步運行的,這意味着您的其他代碼(調用後的行)在回調仍然從服務器獲取數據時執行。

如果你只想要執行的東西一旦回調返回時,從回調的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設置。