等待响应时GWT AsyncCallback将执行多远?
如果我从函数调用(全部用Java编写):等待响应时GWT AsyncCallback将执行多远?,gwt,asynccallback,Gwt,Asynccallback,如果我从函数调用(全部用Java编写): public int hello(){ INTA=1; executeCallback(); //C:问题就在这个范围内 返回a; } public void executeCallback(){ //A:异步回调之前要执行的随机代码 randomClass.randomMethod(intA、intB、AsyncCallback(){ onSuccess(); onFailure(); }); //B:异步回调后执行的随机代码 } 我知道注释A中的内
public int hello(){
INTA=1;
executeCallback();
//C:问题就在这个范围内
返回a;
}
public void executeCallback(){
//A:异步回调之前要执行的随机代码
randomClass.randomMethod(intA、intB、AsyncCallback(){
onSuccess();
onFailure();
});
//B:异步回调后执行的随机代码
}
我知道注释A中的内容将被执行,同时非同步随机方法将被执行,注释B将被执行
不过,我想知道,当randomMethod正在执行时(如果它需要足够长的时间),函数是否会返回到它的调用者(在本例中是方法“hello”)并开始执行注释C中的代码?或者executeCallback会在返回之前等待randomMethod完成吗
如果是前者,假设我需要randomMethod所接触的信息,在我继续评论C之前,我如何让它“等待”以确保情况会如此?当调用异步方法时,程序不会等待该方法,这就是为什么它们被称为异步方法。randomMethod AsyncCallback onSuccess或OnFailure方法无法在表示为B的代码之前执行。。因为浏览器在单个线程中执行javascript代码,所以onSuccess或OnFailure方法在调用executeCallBack方法finish之后执行 如果希望代码B和代码C在randomMethod之后执行,则应将它们放在Success方法上,例如
randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
onSuccess() {
// B: random code to execute after asynccallback
// C: Question lies in this range
}
}
onFailure()
});
randomClass.randomMethod(inta,intb,AsyncCallback()){
onSuccess(){
//B:异步回调后执行的随机代码
//C:问题就在这个范围内
}
}
onFailure()
});
1]
异步通信可能需要一点时间来适应。您需要记住,无论过程在服务器上执行多长时间以及从服务器到客户机的数据传输需要多长时间,客户机都会在调用远程过程之后继续执行下一条语句
2] 您可以执行//C:onSuccess方法中的问题就在这个范围内让我稍微解释一下执行模型,因为如果您知道“幕后”发生了什么,有时会更容易 所有代码执行都由浏览器启动。在某些事件中会发生这种情况,例如,当页面加载时,当用户单击某个内容时,或者当AJAX响应到达时 因此,在编写GWT(或其他JavaScript)应用程序时,您要做的是注册处理程序,例如使用
onModuleLoad()
,或将ClickHandler注册到按钮,或将AsyncCallback注册到GWT-RPC调用
有趣的(也许是违反直觉的)事情是,当浏览器调用这样一个处理程序时,它被执行,直到它完成(或者直到发生错误)。只有在这之后,才会执行其他处理程序。这也意味着,如果一个处理程序的代码包含一个无休止的循环,其他回调将永远不会执行-整个浏览器选项卡将被阻塞
因此,当执行hello()
方法时,这是作为某个处理程序的一部分来完成的(例如onModuleLoad或ClickHandler)。它
- 设置
a=1
- 然后发送一个AJAX请求(
)randomClass.randomMethod
- 注册另一个
处理程序(请记住,这只是一个注册。浏览器将首先完成当前处理程序,然后才能开始实际执行该AsyncCallback处理程序)AsyncCallback
- 执行B
- 执行
- 继续执行调用层次结构,直到处理程序完成
randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
onSuccess() {
// B: random code to execute after asynccallback
// C: Question lies in this range
}
}
onFailure()
});