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

GWT Make synchronous / blocking call using Asynchronus Callback

我设计了一个class让我们称之为实现AsyncCallback 的AsyncClass。 它有两个全局变量 boolean flagObject 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 方法。