首先,我知道做同步调用是“错误的”,也知道“不可能”。
但是,在非常复杂的情况下(我不知道如何解释),我需要等待来自服务器的响应,我使用GWT-Platform命令实现GWT RPC调用。
我在找某种“黑客”来做这件事。
提前谢谢。
发布于 2012-01-05 01:23:10
有一个解决方案,但它并不容易(例如,您不能翻转单个参数来使其工作)。GWT在幕后使用普通的JS XMLHttpRequest。在GWT中,有一种称为com.google.gwt.xhr.client.XMLHttpRequest的覆盖类型。此类用于通过HTTP向服务器发送请求。每个JS XMLHttpRequest首先通过调用open方法进行初始化。这个方法有几个参数,但是第三个参数指定请求是否应该是异步的。如果您将其更改为false,则请求将是同步的。
但是GWT-RPC没有直接使用这个类,它通过RpcRequestBuilder使用它,而且这个类也没有直接使用XMLHttpRequest,它使用的是RequestBuilder。
因此,您需要做的是创建RpcRequestBuilder和RequestBuilder的自定义版本(将使用初始化为同步的XMLHttpRequest )。
您可以通过将GWT-RPC服务实例转换为ServiceDefTarget来设置RPCRequest构建器。
您是否仍然希望拥有同步的GWT-RPC请求?
发布于 2012-01-05 00:53:25
通常,通过处理RPC请求的onSuccess()函数中的内容,您将自动“等待来自服务器的响应”。所以我假设你想阻止当前正在运行的所有代码?由于JavaScript是单线程的,这并不容易,所以没有休眠功能来暂停程序。
但是,使用计时器的黑客可能会执行您想要的操作:
Timer checkRPCResponse = new Timer() {
@Override
public void run() {
if (!serverResponseReceived) {
this.schedule(100);
} else {
proceedWithProgram();
}
}
};
checkRPCResponse.schedule(100);我还没有在上面的例子中尝试过this.schedule(100)是否工作,但是您已经明白了,这是一个检查服务器是否每隔100ms响应一次的检查。当然,您必须在onSuccess()函数中自己设置serverResponseReceived = true。在RPC之后立即调用计时器。
发布于 2016-11-15 21:13:31
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");将始终呈现:
Service called!
Last message请参阅XMLHttpRequest.open()规范的https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open。
https://stackoverflow.com/questions/8729994
复制相似问题