【问题标题】:GWT single threaded callbacksGWT 单线程回调
【发布时间】:2013-04-04 19:28:43
【问题描述】:
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 之前调用位置回调。在这种情况下,表格不会被位置数据刷新。

【问题讨论】:

    标签: gwt concurrency single-threaded


    【解决方案1】:

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

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

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

    附: updateTablerefreshDataWithPosition 之后发生的另一种选择是保存来自两个来源的数据并调用一个在两者都存在时有效的函数:

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

    【讨论】:

    • 这并不是我真正想要的。我想先加载或不加载位置以获得更好的响应能力。如果位置稍后出现,我想刷新数据。
    • 同样根据stackoverflow.com/questions/9999056/…,ajax 回调永远不会中断 JS 代码,因此同步不应该成为单线程 JS 引擎中的问题
    • “我想先加载有或没有位置以获得更好的响应能力” - 所以在 source2callback 中调用 updateTable,然后在 join 中; “ajax 回调永远不会中断 JS 代码”——这就是我所说的。
    • 我说要等到JS代码完成后才会处理事件。
    • 您还说过“这肯定会发生”。这不会发生,因为回调不能在这两行之间中断。
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2011-01-27
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2020-11-21
    相关资源
    最近更新 更多