【问题标题】:How far will GWT AsyncCallback execute while waiting for the response?GWT AsyncCallback 在等待响应时会执行多远?
【发布时间】:2011-02-17 16:39:01
【问题描述】:

如果我从一个函数中调用(全部用 Java 编写):

public int hello() {
int a = 1;
executeCallback();
// C: Question lies in this range
return a;
}

public void executeCallback() {
// A: random code to execute before asynccallback
   randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
      onSuccess();
      onFailure();
   });
// B: random code to execute after asynccallback
}

我知道注释A中的东西会执行,同时非同步randomMethod会执行,B中的注释也会执行。

不过,我想知道,当 randomMethod 正在执行时(如果它需要足够长的时间),该函数是否会返回到它的调用者(在本例中为方法 'hello')并开始执行注释 C 中的代码?还是executeCallback会等待randomMethod完成后再返回?

如果是前者,假设我需要在继续评论 C 之前触及 randomMethod 所触及的信息,我怎样才能让它“等待”以确保会是这种情况?

【问题讨论】:

    标签: gwt asynccallback


    【解决方案1】:

    当调用异步方法时,程序不会等待该方法,这就是它们被称为异步的原因。 randomMethod AsyncCallback onSuccess 或 OnFailure 方法是不可能在 B. 表示的代码之前执行的。因为浏览器在单个线程中执行 javascript 代码,onSuccess 或 OnFailure 方法是在 executeCallBack 方法的调用者完成之后执行的。

    如果你想让代码 B 和代码 C 在 randomMethod 之后执行,你应该把它们放在 onSuccess 方法中,比如 ;

    randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
          onSuccess() {
             // B: random code to execute after asynccallback
            // C: Question lies in this range
            }
          }
          onFailure()
       });
    

    【讨论】:

      【解决方案2】:

      让我稍微解释一下执行模型,因为如果您知道“幕后”发生了什么,有时会更容易。

      所有代码执行都是由浏览器发起的。这发生在某些事件中,例如当页面加载时,当用户点击某些东西时,或者当 AJAX 响应到达时。

      因此,在编写 GWT(或其他 JavaScript)应用程序时,您要做的就是注册处理程序,例如通过使用onModuleLoad(),或将 ClickHandler 注册到 Button,或将 AsyncCallback 注册到 GWT-RPC 调用。

      有趣(也许是违反直觉?)的事情是,当浏览器调用这样的处理程序时,它会执行直到它完成(或直到发生错误)。只有在那之后,才会执行其他处理程序。 这也意味着,如果一个处理程序的代码包含无限循环,其他回调将永远不会被执行 - 整个浏览器选项卡将阻塞。

      因此,当您的 hello() 方法被执行时,这是作为某些处理程序的一部分完成的(例如 onModuleLoad 或 ClickHandler)。它

      • 设置a = 1,
      • 然后发送 AJAX 请求 (randomClass.randomMethod),
      • 注册另一个 AsyncCallback 处理程序(请记住,这只是一个注册。浏览器将首先完成当前处理程序,然后才能实际执行该 AsyncCallback 处理程序)。
      • 执行 B
      • 执行 A
      • 继续向上执行调用层次结构,直到处理程序完成。

      【讨论】:

        【解决方案3】:

        1] 异步通信可能需要一点时间来适应。您需要记住,无论在服务器上执行过程以及从服务器到客户端的数据传输需要多长时间,客户端都会在调用远程过程之后继续执行下一条语句。

        2] 你可以在onSuccess方法中执行 // C: Question在这个范围内

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多