2014-11-21 30 views

回答

1

沒有公佈的序列圖,我瞭解。但它並不是真的有那麼多的幫助,因爲它必須同時處理許多抽象級別:

  • Javascript方面並不真正「調用」Java方面(它發送一個請求,這是另一回事)
  • 客戶端主角色(異步接口的實現)永遠不可見,因爲它是在編譯項目期間生成的。

理解的點是:

  • 服務器側是同步 - 純Servlet API的,具有一個單獨的線程服務每個請求;
  • Javascript方面是異步的。當您使用Javascript發送HTTP請求時,您無法等待響應,您只能提供回調。這就是爲什麼你不能包裝一個在同步接口中返回值的HTTP調用。
  • 在完美的世界中,只會有一個接口,橋接客戶端和服務器端。服務器將實現該接口,並且客戶端以某種方式獲取其代理並將其稱爲方法。這就是同步遠程通常的工作方式。出於上述原因,這是不可能的。
  • 所以我們需要兩個不同的接口:一個用於客戶端(異步)和一個用於服務器(同步)。它們只與慣例保持在一起,因爲Java的類型系統無法表達它們之間的關係(方法名稱相同,參數相關,但不完全相同,返回類型不同),
  • 期間GWT項目的編譯將生成一個實現客戶端界面的類。它的實例可以調用服務器(以異步方式)。服務器然後定位同步接口的相關方法的實現並調用它,併發迴響應(同步)。該響應在javascript的一端觸發回調(異步)。

所以你有它。整個異步性源於對象如何工作。

請注意,官方wiki上的圖表是誤導性的 - Javascript調用異步界面,而不是同步界面(如圖所示)。

+0

所以 - >在做RPC之前,我們用= GWT實例化異步服務代理類。create() - >然後用實例和一個回調對象作爲參數(all async)創建RPC o Async接口 - >服務器在同步接口上定位此方法的實現(如何?)並調用它。 - 同步接口將調用引導到服務實現 - >當服務器端代碼完成時,它會發迴響應(哪個類?) - >響應觸發我們用異步RPC和onfailure發送的回調對象,或者onsucces是調用方法嗎? – Klelund 2014-11-23 00:53:00

+0

真的很好的解釋。我希望你能回答我上面的補充質詢 – Klelund 2014-11-23 00:55:56

1
+0

謝謝。他們聲明「GWT不支持與你的客戶端應用程序進行同步通信,你永遠不會使用同步的」。 ..但它仍然是序列圖上顯示的服務接口,而不是異步接口。它是稱爲客戶端的異步接口。 async - > sync - > serviceImpl之間的連接在哪裏? – Klelund 2014-11-21 19:07:07