Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT使用异步回调进行同步/阻塞调用_Java_Multithreading_Asynchronous_Gwt_Synchronous - Fatal编程技术网

Java GWT使用异步回调进行同步/阻塞调用

Java GWT使用异步回调进行同步/阻塞调用,java,multithreading,asynchronous,gwt,synchronous,Java,Multithreading,Asynchronous,Gwt,Synchronous,我设计了一个名为AsyncClass的类,它实现了AsyncCallback。 它有两个全局变量布尔标志和对象值。 构造函数如下所示: AsyncClass() { this.flag=false; this.val=null; } some_code; make_sync_call; some_other_code; 而onSuccess()函数定义为: public void onSuccess(Object x){ this.flag=true;

我设计了一个名为AsyncClass的类,它实现了AsyncCallback。 它有两个全局变量
布尔标志
对象值
。 构造函数如下所示:

AsyncClass()
{
    this.flag=false;
    this.val=null;
}
some_code;
make_sync_call;
some_other_code;
onSuccess()
函数定义为:

public void onSuccess(Object x){
      this.flag=true;
      this.val=x;
}
现在我想要的是从这里得到一个返回值。 所以我打了个电话:

AsyncClass callback=new AsyncClass();
service.getResult(createRequestObject(),callback)
我有一个while循环在运行,它一直在等待标志变为真

while(!callback.flag);
然而,它陷入了一个无限循环。
为什么会发生这种情况???

您不需要使用预定义的
onSuccess
方法预先创建
Async
类,您可以当场定义它们。
如果要进行异步调用,然后在调用成功后使用返回值,请尝试以下操作:

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.
});
service.getResult(createRequestObject(),new AsyncCallback()){
成功时公共无效(最终字符串返回值){
doSomethingWithString(返回值);
}
//失败等。
});
一旦调用成功,就会调用
doSomethingWith
方法,并从那里继续执行



编辑:根据OP的注释,看起来他们试图从客户端代码实现一个同步调用,而不是异步调用(尽管命名为“异步”)。我不确定使用GWT的RPC库是否可能。根据和,您必须通过JSNI方法在纯Javascript中实现调用。但是,您应该注意到,这些问题的所有答案都建议避免同步调用,而改为异步调用。

您正在进行的调用是异步的,您希望使其像同步一样工作。 根据我的经验,这不太实际,您可能需要重构一点,如下所示:

AsyncClass()
{
    this.flag=false;
    this.val=null;
}
some_code;
make_sync_call;
some_other_code;
进入

如果有充分的理由说明您确实需要进行忙等待而不是基于回调,那么“javascript忙等待”可能就是您要查找的关键字(例如,此处)


但是请注意,我强烈建议您不要使用它,也不要使用基于回调的方法。

您需要使用AsyncCallback的onFailure和onSuccess方法。GWT是事件驱动的,因此调用将成功或失败,并将调用其中一个方法。把它想象成一个电话,然后忘记,然后等待一个事件,无论是成功还是失败……这正是我正在做的。onSuccess方法应该打开该标志,因此while循环条件满足false并退出。但是while循环将永远持续下去。这是因为回调对象由当前线程持有,并且在它释放之前,不会发生任何事情吗?正确-只有一个线程,因此在启动对服务器的调用的代码将控制权返回到浏览器之前,甚至无法尝试运行onSuccess。有什么办法吗?使用并行线程还是什么?service.getResult做什么?你没有抓住要点。我想阻止,直到我得到一个返回值。问题是因为它是一个单线程系统,所以阻塞机制不允许执行onsuces()。如果您使用AsyncCallback机制来实现同步调用,我会说您是一个缺少要点的人。无论如何,我会修改我的答案。