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之前调用位置回调。在这种情况下,表格不会使用位置数据刷新。
答案 0 :(得分:2)
GWT行为与JavaScript行为没有任何不同。
只有在JavaScript代码重新发布控制流时才会处理事件。
执行无限循环for(;;);
并且之后不会处理任何事件,因为控件永远不会被释放。
这里的危险是在updateTable完成之后但在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)
}