GWT 使用异步回调进行同步/阻塞调用
GWT Make synchronous / blocking call using Asynchronus Callback
我设计了一个class让我们称之为实现AsyncCallback 的AsyncClass。
它有两个全局变量 boolean flag
和 Object val
。
构造函数如下所示:
AsyncClass()
{
this.flag=false;
this.val=null;
}
和onSuccess()
函数定义为:
public void onSuccess(Object x){
this.flag=true;
this.val=x;
}
现在我想要的是从这里得到一个 return 值。
所以我打个电话:
AsyncClass callback=new AsyncClass();
service.getResult(createRequestObject(),callback)
我有一个 while 循环 运行,它一直在等待标志变为真。
while(!callback.flag);
但是它陷入了无限循环。
为什么会这样??
您不需要使用预定义的 onSuccess
方法预先创建 Async
类,您可以在现场定义它们。
如果您想进行异步调用,然后在调用成功后使用 return 值,请尝试以下操作:
service.getResult(createRequestObject(), new AsyncCallback() {
public void onSuccess(final Object returnedValue) {
doSomethingWith(returnedValue);
}
public void onFailure(Throwable caught) {
// code for the call failing (alert, log...)
}
});
更好的是,如果您的服务 return 是某种类型,例如 String
,请使用通用版本的 AsyncCallback 而不是原始版本:
service.getResult(createRequestObject(), new AsyncCallback<String>() {
public void onSuccess(final String returnedValue) {
doSomethingWithString(returnedValue);
}
// onFail etc.
});
一旦调用成功,您的 doSomethingWith
方法将被调用并从那里继续执行。
编辑:根据 OP 的评论,看起来他们正在尝试从客户端代码实现 同步 调用,而不是异步调用(尽管 "Async" 命名).我不确定使用 GWT 的 RPC 库是否可行。根据 this, this, and this,您必须通过 JSNI 方法在纯 Javascript 中实现调用。但是,您应该注意到,这些问题的所有答案都建议避免同步调用,而改用异步调用。
您正在进行的调用是异步的,您希望它像同步一样工作。
根据我的经验,这不是很实用,你可能想重构一点,像这样:
some_code;
make_sync_call;
some_other_code;
进入
some_code;
make_sync_call(new Receiver() {
void onSuccess() {
some_other_code;
}
}
如果有确凿的理由说明您确实需要忙着等待而不是 callback-based,那么 "javascript busy wait" 可能就是您要查找的关键字(例如,此处 What is the JavaScript version of sleep()? )
但是请注意,我强烈建议不要使用它,并建议使用 callback-based 方法。
我设计了一个class让我们称之为实现AsyncCallback 的AsyncClass。
它有两个全局变量 boolean flag
和 Object val
。
构造函数如下所示:
AsyncClass()
{
this.flag=false;
this.val=null;
}
和onSuccess()
函数定义为:
public void onSuccess(Object x){
this.flag=true;
this.val=x;
}
现在我想要的是从这里得到一个 return 值。 所以我打个电话:
AsyncClass callback=new AsyncClass();
service.getResult(createRequestObject(),callback)
我有一个 while 循环 运行,它一直在等待标志变为真。
while(!callback.flag);
但是它陷入了无限循环。 为什么会这样??
您不需要使用预定义的 onSuccess
方法预先创建 Async
类,您可以在现场定义它们。
如果您想进行异步调用,然后在调用成功后使用 return 值,请尝试以下操作:
service.getResult(createRequestObject(), new AsyncCallback() {
public void onSuccess(final Object returnedValue) {
doSomethingWith(returnedValue);
}
public void onFailure(Throwable caught) {
// code for the call failing (alert, log...)
}
});
更好的是,如果您的服务 return 是某种类型,例如 String
,请使用通用版本的 AsyncCallback 而不是原始版本:
service.getResult(createRequestObject(), new AsyncCallback<String>() {
public void onSuccess(final String returnedValue) {
doSomethingWithString(returnedValue);
}
// onFail etc.
});
一旦调用成功,您的 doSomethingWith
方法将被调用并从那里继续执行。
编辑:根据 OP 的评论,看起来他们正在尝试从客户端代码实现 同步 调用,而不是异步调用(尽管 "Async" 命名).我不确定使用 GWT 的 RPC 库是否可行。根据 this, this, and this,您必须通过 JSNI 方法在纯 Javascript 中实现调用。但是,您应该注意到,这些问题的所有答案都建议避免同步调用,而改用异步调用。
您正在进行的调用是异步的,您希望它像同步一样工作。 根据我的经验,这不是很实用,你可能想重构一点,像这样:
some_code;
make_sync_call;
some_other_code;
进入
some_code;
make_sync_call(new Receiver() {
void onSuccess() {
some_other_code;
}
}
如果有确凿的理由说明您确实需要忙着等待而不是 callback-based,那么 "javascript busy wait" 可能就是您要查找的关键字(例如,此处 What is the JavaScript version of sleep()? )
但是请注意,我强烈建议不要使用它,并建议使用 callback-based 方法。