2012-05-28 41 views
0

我正在將本機Java應用程序轉換爲GWT。與服務器的通信僅在狀態更改期間發生,到目前爲止已通過阻止操作處理。GWT:用異步RPC替換阻塞調用

例如當前同步邏輯:

void onUserClickedSync() { 
    downloadData(); // blocking operation 
    uploadData(); // blocking operation 
    setState(DONE); 
} 

我怎樣才能接近更換阻塞操作與利用異步回調的呢?

我目前的想法是基本上增加了一堆額外的「繁忙」狀態,它們什麼都不做。然後,我將使用RPC的回調來觸發下一個狀態,邏輯可以繼續。

例如同步邏輯將變成:

void onUserClickedSync() { 
    rpc.downloadData(new AsyncCallback<Data> { 
     public void onSuccess(Data result) { 
      //... 
      onDownloaded(); 
     } 
     //... 
    }); 
    setState(WAITING_FOR_DOWNLOAD); 
} 

void onDownloaded() { 
    rpc.uploadData(new AsyncCallback<Void> { 
     public void onSuccess(Void void) { 
      //... 
      setState(DONE); 
     } 
    //... 
    }); 
    setState(WAITING_FOR_UPLOAD); 
} 

是這種方法有效嗎?我需要注意什麼?

編輯:重寫我的僞代碼的例子,因爲他們很不清楚。

+0

對不起,但我不明白如果你想委託實際操作一個線程,或者當「4什麼都不做......」 –

+0

好吧,那有點讓人困惑。刪除它。 :) – vaughandroid

+0

好的,那麼在第3步之後你會做什麼?輸入一個等待回調的忙等待循環來設置外部狀態? –

回答

1

好的,對不起,你用問題糾纏你,但這個例子對我來說並不是很清楚。

現在我對情況有了更好的處理是的,我認爲你的方法是可行的。 請注意,當回調改變系統的狀態時,沒有可能與其他事件同時發生衝突的「副作用」。

具體而言,您是否可能會「等待多個回調」(即用戶開始4次上傳,因此您可能會得到4次回調,不一定按照「正確的順序」)並不清楚。另外,uploaddata方法在相應的下載數據之前有沒有機會結束?

一般來說,你必須小心,因爲雖然你以前的代碼犧牲了可預測性的響應性(例如,直到第一次下載完成時纔會發生),現在事情發生的順序更加不可預測,而且有時可能會引入微妙的錯誤很難正確診斷或複製。

我們沒有看到應用程序的其餘部分,所以不太清楚回調之間還會發生什麼,但我強烈建議您對此非常小心,並且還要使回調錯誤處理特別健壯(即,如果上傳中途失敗,會發生什麼情況?你是否仍然收到服務器的回叫,告訴你它中止了什麼狀態?

+0

不用擔心。這些問題 - 我最初的例子是垃圾。描述問題是我絕對需要解決的問題......無論如何,(最初至少)會確保系統一次只等待一個回調。我需要盡我所能在現階段限制我的變化的複雜性...... – vaughandroid

1

在爲遠程交互設計接口時,通常應儘可能使操作儘可能粗糙,以減少延遲。

特別是,您可以將您的「下載」和「上傳」合併到一個操作中。通過這種方式,您可以將延遲減少到單次往返並消除多個等待狀態。