Java 伪造GWT同步RPC调用

Java 伪造GWT同步RPC调用,java,ajax,gwt,gwt-rpc,Java,Ajax,Gwt,Gwt Rpc,首先,我知道进行同步调用是“错误的”,并且知道“不可能” 但是,在非常复杂的情况下(我不知道如何解释),我需要等待服务器的响应,我正在使用GWT平台命令实现GWT RPC调用 我一直在寻找这样做的“黑客” 提前感谢。通常,通过处理RPC请求的onSuccess()函数中的内容,您将自动“等待服务器的响应”。所以我假设您想要阻止当前运行的所有代码?由于JavaScript是单线程的,这并不容易,因此没有任何睡眠函数可以停止程序 但可能是使用计时器的黑客做了你想做的事: Timer chec

首先,我知道进行同步调用是“错误的”,并且知道“不可能”

但是,在非常复杂的情况下(我不知道如何解释),我需要等待服务器的响应,我正在使用GWT平台命令实现GWT RPC调用

我一直在寻找这样做的“黑客”


提前感谢。

通常,通过处理RPC请求的
onSuccess()
函数中的内容,您将自动“等待服务器的响应”。所以我假设您想要阻止当前运行的所有代码?由于JavaScript是单线程的,这并不容易,因此没有任何睡眠函数可以停止程序

但可能是使用计时器的黑客做了你想做的事:

    Timer checkRPCResponse = new Timer() {
        @Override
        public void run() {
            if (!serverResponseReceived) {
                this.schedule(100);
            } else {
                proceedWithProgram();
            }
        }
    };
    checkRPCResponse.schedule(100);

在上面的示例中,我没有尝试过
this.schedule(100)
是否有效,但您知道了,这是检查服务器是否每100毫秒响应一次。当然,您必须在
onSuccess()函数中设置
serverResponseReceived=true
您自己。在RPC之后调用计时器

有一个解决方案,但并不容易(例如,无法翻转单个参数使其工作)。GWT正在引擎盖下使用普通JS XMLHttpRequest。在GWT中,有一个覆盖类型称为com.google.GWT.xhr.client.XMLHttpRequest。此类用于通过HTTP向服务器发送请求。每个JSXMLHttpRequest首先通过调用open方法初始化。此方法的参数很少,但第三个参数指定请求是否应该是异步的。如果将其更改为false,则请求将是同步的

但是GWT-RPC不直接使用这个类,它通过RpcRequestBuilder使用它,这个类也不直接使用XMLHttpRequest,它使用的是RequestBuilder

因此,您需要做的是创建定制版本的RpcRequestBuilder和RequestBuilder(将使用初始化为同步的XMLHttpRequest)

您可以通过将RPCRequest builder强制转换为ServiceDefTarget,将其设置为GWT-RPC服务实例


是否仍要同步GWT-RPC请求?

GWT调用XMLHttpRequest.open(),其第三个参数为true,这意味着调用将是异步的。我解决了类似的测试需求,只是强制第三个参数始终为false:

private static native void fakeXMLHttpRequestOpen() /*-{
   var proxied = $wnd.XMLHttpRequest.prototype.open;

   (function() {
       $wnd.XMLHttpRequest.prototype.open =
           function() {
                arguments[2] = false;
                return proxied.apply(this, [].slice.call(arguments));
            };
        })();
}-*/;
调用fakeXMLHttpRequestOpen()后,XMLHttpRequest的任何进一步使用都将同步进行。例如:

remoteSvc.getResult(new AsyncCallback<String>() {
    @Override
    public void onSuccess(String result) {
        GWT.log("Service called!");
    }

    @Override
    public void onFailure(Throwable caught) {
        GWT.log("Service failed...");
    }
}

GWT.log("Last message");

有关XMLHttpRequest.open()规范,请参阅。

不要这样做。为您的问题找到异步解决方案更好。“首先,我知道执行同步调用是“错误的”,并且知道“不可能”。“这是可能的,但并不容易,您真的想这样做吗?很难用这些信息给出答案,但是,您不能在rpc调用之前将所有小部件从dom中分离出来,并将它们附加到onSuccess()中的dom吗?如果这是您想要的,则在调用时用户无法执行任何操作。然后以不同的方式设计代码,这样您就不必“为空对象构建小部件和演示器”。例如,只需等待onSuccess开始“构建”任何东西。我已经尝试过这样做,但它不起作用,因为我需要一个getter。无论如何,我做了一点变通,在响应来自服务器之前调用一个事件,在presenter中,我需要这些信息,我再次更新了所有小部件。这不是解决我问题的最好办法,但是,这是我找到的唯一办法……上帝之母,努力工作。我放弃了做这件事。我现在就把你的答案说成是正确的。无论如何,谢谢你。
Service called!
Last message