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 异步回调如何与单线程(或者可能是多线程 javascript 引擎)一起工作?这里的危险是在 updateTable 完成但 isLoaded 设置为 true 之前调用位置回调。在这种情况下,表格不会使用位置数据进行刷新。

4

1 回答 1

2

GWT 行为与 JavaScript 行为没有任何不同。仅当 JavaScript 代码释放控制流时才会处理这些事件。做一个无限循环for(;;);,之后不会处理任何事件,因为控制永远不会被释放。

这里的危险是在 updateTable 完成但 isLoaded 设置为 true 之前调用位置回调。在这种情况下,表格不会使用位置数据进行刷新。

只要updateTable是同步的就没有危险(例如内部不使用回调)。

updateTablePS之后发生的另一个选择refreshDataWithPosition是保存来自两个来源的数据并调用一个在两者都存在时起作用的函数:

source1callback (position) {
  this.position = position;
  join();
}
source2callback (data) {
  this.data = data;
  join();
}
join() {
  if (this.position && this.data) updateTable (this.data, this.position)
}
于 2013-04-04T21:16:40.403 回答