2011-02-17 49 views
5

如果我是從一個函數(全部用Java編寫的)撥打:GWT AsyncCallback在等待響應時執行多遠?

public int hello() { 
int a = 1; 
executeCallback(); 
// C: Question lies in this range 
return a; 
} 

public void executeCallback() { 
// A: random code to execute before asynccallback 
    randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() { 
     onSuccess(); 
     onFailure(); 
    }); 
// B: random code to execute after asynccallback 
} 

據我所知,在評論一個東西將執行,併兼任非同步randomMethod將執行和B中的評論將執行。我想知道,雖然randomMethod正在執行(如果它需要足夠長的時間),函數將返回到它的調用者(在這種情況下,方法'hello'),並開始執行註釋C中的代碼嗎?或者executeCallback在返回之前等待randomMethod完成?

如果是前者,假設我需要randomMethod觸及的信息才能繼續評論C,我該如何讓它「等待」以確保這種情況?

回答

3

當調用異步方法時,程序不會等待該方法,這就是爲什麼它們被稱爲異步。沒有辦法在代碼表示爲B之前執行randomMethod AsyncCallback onSuccess或OnFailure方法。因爲瀏覽器在單個線程中執行javascript代碼,所以在executeCallBack方法的調用者完成之後,將執行onSuccess或OnFailure方法。

如果你想讓代碼B和代碼C在randomMethod之後執行,你應該把它們放在成功方法上,比如;

randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() { 
     onSuccess() { 
     // B: random code to execute after asynccallback 
     // C: Question lies in this range 
     } 
     } 
     onFailure() 
    }); 
1

1] 異步通信可能需要一點時間才能習慣。您需要記住,無論服務器上的過程執行多久,以及從服務器到客戶端的數據傳輸如何,客戶端都會在調用遠程過程之後繼續執行下一個語句。

2]您可以執行// C:問題就出在這範圍內的onSuccess方法

2

讓我來解釋執行模型一點,因爲它有時更容易,如果你知道會發生什麼「幕後」。

所有的代碼執行都是由瀏覽器啓動的。這發生在某些事件,例如加載頁面時,用戶點擊某些內容或AJAX響應到達時。因此,當您編寫GWT(或其他JavaScript)應用程序時,您要註冊處理程序,例如,通過使用onModuleLoad(),或通過註冊一個ClickHandler到一個Button,或一個AsyncCallback到一個GWT-RPC調用。

有趣的(也許是反直覺?)的事情是,當瀏覽器調用這樣一個處理程序時,它會執行直到它完成(或直到發生錯誤)。只有在那之後,其他的處理程序纔會被執行。 這也意味着,如果一個處理程序的代碼包含無限循環,其他回調將永遠不會執行 - 整個瀏覽器選項卡將被阻止。

因此,當您的hello()方法執行時,這是作爲某個處理程序(例如onModuleLoad或ClickHandler)的一部分完成的。它

  • a = 1
  • 然後發送AJAX請求(randomClass.randomMethod),
  • 寄存器另一個AsyncCallback處理程序(記住,這僅僅是一個登記該瀏覽器將第一完成當前的處理程序處理,纔可以到實際執行該AsyncCallback處理程序)。
  • 執行乙
  • 執行
  • 繼續執行該呼叫層次結構,直到處理完畢。