我设计了一个类让我们称之为AsyncClass,它实现了AsyncCalllback。
它有两个全局变量boolean flag
和Object val
。
构造函数看起来像这样:
AsyncClass()
{
this.flag=false;
this.val=null;
}
和onSuccess()
函数定义为:
public void onSuccess(Object x){
this.flag=true;
this.val=x;
}
现在我想要的是从这里得到一个返回值。 所以我打个电话:
AsyncClass callback=new AsyncClass();
service.getResult(createRequestObject(),callback)
我有一个while循环运行,它一直等待标志变为真。
while(!callback.flag);
然而它陷入无限循环。 为什么会发生这种情况?
答案 0 :(得分:1)
您无需事先使用预定义的Async
方法创建onSuccess
课程,您可以在现场定义它们。
如果要进行异步调用,然后在调用成功后使用返回值,请尝试以下操作:
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...)
}
});
更好的是,如果您的服务返回某个类型,例如String
,请使用AsyncCallback的通用版本而不是原始版本:
service.getResult(createRequestObject(), new AsyncCallback<String>() {
public void onSuccess(final String returnedValue) {
doSomethingWithString(returnedValue);
}
// onFail etc.
});
调用完成后如果成功,将调用doSomethingWith
方法并从那里继续执行。
答案 1 :(得分:0)
您正在进行的通话是异步的,并且您希望它的工作方式与同步一样。 根据我的经验,这不太实用,你可能想稍微重构一下,如下:
some_code;
make_sync_call;
some_other_code;
进入
some_code;
make_sync_call(new Receiver() {
void onSuccess() {
some_other_code;
}
}
如果有充分的理由说明为什么你真的需要忙而不是基于回调,那么&#34; javascript忙等待&#34;可能是您正在寻找的关键字(例如,此处What is the JavaScript version of sleep()?)
但请注意,我强烈反对,以及基于回调的方法。