2013-02-12 36 views
0

我有一個文本區域和一個按鈕。當我在文本區域放置一些文本時(在粘貼瀏覽事件中,所有其他事件都被忽略)或者單擊一個按鈕,同一個調用通過文本區域的值更改處理程序發送到服務器,然後單擊該按鈕的處理程序。如果數據錯誤,服務器將引發異常,並以消息框的形式返回給客戶端。一個異步調用而不是兩個GWT

所以當我把一些數據放到文本區域並點擊一個按鈕時,出現兩個消息框。有沒有辦法讓這種情況下出現一個消息框?

一些代碼示例中的問題:

textArea.addValueChangeHandler(new ValueChangeHandler<String>() { 
    @Override 
    public void onValueChange(ValueChangeEvent<String> event) { 
     fireHandlers(); 
    } 
}); 

button.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     fireHandlers(); 
    } 
}); 

//............ 

private void fireHandlers() { 
    for (MyProcessHandler handler : myHandlersList) { 
    handler.handle(); 
    } 
} 

//............ 

public static interface MyProcessHandler { 
    public void handle(); 
} 

//............ 

addMyProcessHandler(new MyProcessHandler() { 
    @Override 
    public void handle() { 
     AsyncCallback<String[]> ac = new AsyncCallbackAdapter<String[]>() { 
      public void onSuccess(String[] data) { 
       //post processing 
      } 

      @Override 
      public void onFailure(Throwable throwable) { 
       super.onFailure(throwable); 
      } 
     }; 
     RemoteCall.getMyService().getResultFromData(textArea.getData(), ac); 
    } 
}); 
+1

只需引入一個標誌來確保單個調用,如果fireHandlers執行了切換標誌,並且所有其他調用都將被忽略。在響應只是切換標誌回來。我還爲其中一個項目做了重複的請求過濾器,但這不是您的情況所必需的。 – 2013-02-12 10:26:09

回答

0

我覺得阿列克謝說是這樣的:

private boolean eventFired = false; 

textArea.addValueChangeHandler(new ValueChangeHandler<String>() { 
    @Override 
    public void onValueChange(ValueChangeEvent<String> event) { 
     fireHandlers(); 
    } 
}); 

button.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     fireHandlers(); 
    } 
}); 

//............ 

private void fireHandlers() { 
    if(!eventFired) { 
     eventFired = true; 
     for (MyProcessHandler handler : myHandlersList) { 
      handler.handle(); 
     } 
    } 
} 

//............ 

public static interface MyProcessHandler { 
    public void handle(); 
} 

//............ 

addMyProcessHandler(new MyProcessHandler() { 
    @Override 
    public void handle() { 
     AsyncCallback<String[]> ac = new AsyncCallbackAdapter<String[]>() { 
      public void onSuccess(String[] data) { 
       eventFired = false; 
       //post processing 
      } 

      @Override 
      public void onFailure(Throwable throwable) { 
       super.onFailure(throwable); 
       eventFired = false; 
      } 
     }; 
     RemoteCall.getMyService().getResultFromData(textArea.getData(), ac); 
    } 
}); 

讓你決定在哪裏把eventFired=false在你的代碼。也許在處理來自服務器的答案之後,也許剛剛開始異步調用以在等待服務器時啓用其他操作之後。

+0

我試過這樣的變體,但是在消息框出現之前標誌被設置爲假,並且我設法點擊按鈕。結果出現了兩個消息框:(我想到了禁止事件的想法,如果消息框出現,我會取消事件抑制或類似的東西,但這只是沒有解決方案的想法,至少我現在沒有看到它。 – Dragon 2013-02-13 10:34:12

+0

如果問題只是在消息框出現之前將該標誌設置爲false,那麼您可以將它移動到正確的位置 - 超類的'onFailure()'方法的代碼的最後一行 也許不同之處在於可以調用'MyClass.setEventFired(false)'而不是'eventFired = false'。'eventFired'成員和'setEventFired(boolean eventFired)'應該是靜態的。 也許super應該包含成員'eventFired'。 – qben 2013-02-13 21:41:03

+0

我試過了當另一個類中有異步調用時 - 事件被正確阻塞直到結果準備好,但是如果異步調用在同一個類中,那麼按鈕點擊被放入隊列中,並且在第一次調用返回之後錯誤並顯示MessageBox,標誌設置爲false,並進行下一次調用。所以我最後有兩個消息框:( – Dragon 2013-02-22 10:43:10