讓我給你一個比喻。
你,老闆,打電話給供應商,得到一些產品信息。供應商說他們需要給你回電,因爲這些信息需要一些時間才能收集。所以,你給他們與你的工頭聯繫。
您的領班等待電話。然後你告訴你的領班如果需要30分鐘以上的時間取消信息請求。
你的領班認爲你是瘋子,因爲他無法取消請求,因爲他沒有一個帳戶,使他有權訪問供應商的訂購系統。
因此,您的工頭在30分鐘後根本無視供應商的任何響應。你的巧妙工頭在他的電話裏設置了一個計時器,在30分鐘後忽略了供應商的電話。即使你殺了你的工頭,切斷了所有的通訊鏈接,供應商仍然會忙着處理你的請求。
GWT客戶端沒有任何東西可以取消。回調只是一個等待被調用的javascript對象。
要取消呼叫,您需要告訴服務器端停止浪費cpu資源(如果這是您的擔憂)。您的服務器端必須編程爲提供一個服務API,該API在被調用時將取消該作業並立即返回以觸發您的GWT回調。
您可以刷新頁面,並放棄頁面請求並關閉套接字,但服務器端仍然會運行。並且,當服務器端完成其任務並嘗試執行http響應時,它將失敗,並在服務器日誌中稱其丟失了客戶端套接字。
這是一個非常直接的推理。
因此,它落入您的servlet /服務的設計中,以前的請求如何被後續請求識別。
級聯回調
如果請求2是依賴於要求1的狀態,你應該進行級聯的回調。如果請求2將在成功運行,那麼您應該將請求2放入回調的onFailure塊中。而不是一個接一個地提交這兩個請求。
否則,定時器應觸發請求2,和請求2將有兩個職責:
有實際上是可以在客戶端取消的東西 - http請求本身。如果服務器以某種方式卡住(下一次調用無法取消先前的情況),則連接可能保持打開狀態,並且根據瀏覽器的不同,可能會導致連接失敗。或者正在下載圖像,因此無法創建第二個RPC請求。事實證明,可以殺死http連接,但是這不會告訴服務器停止,只是釋放傳輸。爲此,從異步接口方法而不是void返回com.google.gwt.http.client.Request',並調用cancel。 – 2012-01-06 04:52:54