2013-04-04 60 views
0
positionService.call(new PositionCallback(){ onPositionUpdate(Position position) 
{ 
    this.position=position; 
    if (isLoaded){ 
     refreshDataWithPosition(); 
    } 
}); 

dataService.call(new DataCallback(){ onDataUpdate(Data data) 
{ 
    //does this need synchronization? 
    updateTable(data,position); 
    isLoaded=true; 
}); 

我上面有以下代碼。它同時加載GPS地理定位位置和所有數據。如果GPS數據更新第一個updateTable將更新考慮到這一點。如果GPS數據第二次更新,它將調用refreshDataWithPosition刷新其內容。我想更新表格,無論是否有位置以獲得更快速響應的體驗。GWT單線程回調

GWT異步回調如何在單線程(或可能是多線程JavaScript引擎)下工作? 這裏的危險是在updateTable完成後isLoaded被設置爲true之前調用位置回調。在這種情況下,表格將不會刷新位置數據。

回答

2

GWT行爲與JavaScript行爲沒有任何區別。 只有在控制流由JavaScript代碼釋放時纔會處理事件。 做一個無限循環for(;;);並且之後沒有事件將被處理,因爲控制從未被釋放。

這裏的危險是在updateTable完成後但在isLoaded被設置爲true之前調用位置回調。在這種情況下,表格將不會刷新位置數據。

只要updateTable是同步的(例如,在內部不使用回調),就沒有危險。

P.S.對於updateTablerefreshDataWithPosition發生後,另一種選擇是從兩個來源保存數據,打電話的時候都存在,其工作的功能:

source1callback (position) { 
    this.position = position; 
    join(); 
} 
source2callback (data) { 
    this.data = data; 
    join(); 
} 
join() { 
    if (this.position && this.data) updateTable (this.data, this.position) 
} 
+0

它不是真的是我想要但。我想首先加載或不加載位置以獲得更好的響應。如果職位稍後出現,我想刷新數據。 – 2013-04-04 21:20:44

+0

也根據這個http://stackoverflow.com/questions/9999056/are-event-handlers-guaranteed-to-complete-before-ajax-callbacks-are-誘惑ajax回調將永遠不會中斷的JS代碼,所以同步不應該成爲單線程JS引擎中的一個問題 – 2013-04-04 21:29:47

+1

「我想首先加載或不加載位置以獲得更好的響應性」 - 所以在source2callback中調用updateTable,然後在加入中; 「ajax回調將永遠不會中斷JS代碼」 - 這就是我所說的。 – ArtemGr 2013-04-04 21:37:46