GWT使用Asynchronus Callback进行同步/阻塞调用

时间:2017-02-05 17:04:56

标签: java multithreading asynchronous gwt synchronous

我设计了一个类让我们称之为AsyncClass,它实现了AsyncCalllback。 它有两个全局变量boolean flagObject 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);

然而它陷入无限循环。 为什么会发生这种情况?

2 个答案:

答案 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方法并从那里继续执行。

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

答案 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()?

但请注意,我强烈反对,以及基于回调的方法。