GWT AsyncCallback在等待响应时会执行多远?

时间:2011-02-17 06:12:20

标签: gwt asynccallback

如果我要从函数调用(全部用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返回之前等待randomMethod完成吗?

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

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

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

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

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

答案 2 :(得分:1)

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

2]你可以在onSuccess方法

中执行// C:问题在这个范围内