2013-04-04 3 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 впервые обновит таблицу, это будет учтено. Если во время обновления GPS-данных он будет вызывать refreshDataWithPosition, чтобы обновить его содержимое. Я хочу обновить таблицу с позицией или без нее для более отзывчивого опыта.GWT однопоточные обратные вызовы

Как работает обратный вызов GWT async с одиночной потоковой обработкой (или, возможно, многопоточным механизмом javascript)? Опасность здесь - вызов обратного вызова, который вызывается после завершения finalTable, но перед значением isLoaded установлено значение true. В этом случае таблица не будет обновляться данными позиции.

ответ

2

Поведение GWT ничем не отличается от поведения JavaScript. События обрабатываются только тогда, когда поток управления обновляется кодом JavaScript. Выполняйте бесконечный цикл for(;;);, и после этого события не будут обработаны, потому что элемент управления никогда не будет выпущен.

Опасность здесь - вызов обратного вызова, который вызывается после завершения обновления, но перед значением isLoaded установлено значение true. В этом случае таблица не будет обновляться данными позиции.

Не существует опасности, поскольку updateTable является синхронным (например, не использует обратные вызовы внутри).

P.S. Другой вариант для updateTable произойдет после того, как refreshDataWithPosition, чтобы сохранить данные из обоих источников и вызвать функцию, которая работает, когда оба присутствуют:

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

Это не совсем то, что я хочу, хотя. Я хочу загрузить сначала с или без позиции, чтобы лучше реагировать. Если позиция появится позже, я хочу обновить данные. –

+0

Также в соответствии с этим http://stackoverflow.com/questions/9999056/are-event-handlers-guaranteed-to-complete-before-ajax-callbacks-are-invoked обратный вызов ajax никогда не прерывает JS-код, поэтому синхронизация не должна быть проблемой в однопоточных JS-машинах –

+1

«Я хочу сначала загружать или не иметь позицию, чтобы иметь лучшую отзывчивость» - так вызывать updateTable в source2callback, затем в join; «обратный вызов ajax никогда не прерывает JS-код» - вот что я сказал. – ArtemGr

Смежные вопросы