Gwt 同步呼叫

Gwt 同步呼叫,gwt,asynchronous,sync,synchronous,jsni,Gwt,Asynchronous,Sync,Synchronous,Jsni,我在GWT中有一个方法,它使用请求的fire方法从数据库检索数据,因为大家都知道它是异步的,我从JS调用这个方法,所以我需要使同步成为可能 私有静态字符串检索(字符串部分) { ClientFactory=GWT.create(ClientFactory.class); MyRequestFactory requestFactory=clientFactory.getRequestFactory(); YadgetRequest request=requestFactory.YadgetRequ

我在GWT中有一个方法,它使用请求的fire方法从数据库检索数据,因为大家都知道它是异步的,我从JS调用这个方法,所以我需要使同步成为可能

私有静态字符串检索(字符串部分)
{
ClientFactory=GWT.create(ClientFactory.class);
MyRequestFactory requestFactory=clientFactory.getRequestFactory();
YadgetRequest request=requestFactory.YadgetRequest();
字符串条件=“!”+部分;
最终ArrayList标记=新ArrayList();
request.getTagsStartingWith(标准,10,0).fire(
新接收器(){
@凌驾
成功时公共无效(列表标记列表){
字符串输出=“[”;
用于(标记代理:标记列表){
输出+=“{”;
输出+=“\”id\”:“+”\”+pt.getId()+“\”,”;
输出+=“\”值\”:
+ "\""
+pt.getName().replaceAll(“\”,“”)
.replaceAll(“!”,“)+“\”;
输出+=“},”;
}
if(output.length()>2)
output=output.substring(0,output.length()-1);
输出+=“]”;
添加(输出);
}
@凌驾
public void onFailure(服务器故障错误){
}
});
返回标记。大小()+“”;
}
从JS调用此函数,如下所示:

public静态本机void exportStaticMethod()/*-{
$wnd.ComputeLoAnterest=
$wnd.getAutocomplete=@com.yadget.client.yadget::retrievelocation(Ljava/lang/String;);
}-*/;
onModuleLoad()
中,我调用
exportStaticMethod()

在html中,我有一个按钮,我在单击时调用它
getAutocomplete()
,如下所示:


问题是大小总是返回0,因为该方法是异步的,但如果我能在成功时返回值
onSuccess
,这将解决我的问题。有什么想法吗?我已经用谷歌搜索了2天,没有得到任何答案

换言之:

我有JS方法,我需要它调用java方法从数据库中检索数据,但同步

范例


如果我有一个HTML按钮并单击,我会将ID传递给一个函数,我需要通过GWT从DB中检索名称并提醒它;仅仅因为GWT是异步的,我不能每次都这样做,当我提醒结果时,它将是空的,因为它尚未填充。

您不能同步使用本机GWT RPC。 我不确定您是否在问这个问题,但下面是如何同步调用服务器:

私有本机字符串makeSyncAjaxCall(字符串url、字符串msgText、字符串conType)/*-{
var xhReq=新的XMLHttpRequest();
xhReq.open(conType,url,false);
if(conType==“POST”)xhReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhReq.send(msgText);
var serverResponse=xhReq.status+xhReq.responseText;
返回服务器响应;
}-*/; 

请注意,我没有讨论这是否是个好主意。您可能应该坚持使用Async,并在成功事件上发出警报。

GWT不允许对服务器进行同步调用,因为它们可能会使浏览器挂起,直到收到响应为止,因此出于明显的原因,最好更改流,以便来自服务器的结果将在
onSuccess
事件处理程序中处理

我的业务需要是让JS函数从DB检索数据,但它必须是同步的


您只能通过java(或使用任何其他服务器端语言)从数据库获取数据,但不使用JavaScript。只需使用
RequestBuilder
或GWT RPC机制从GWT进行异步调用。返回的数据可以在适当的处理程序中处理,如前所述。

Ahmad,参考您引用的示例:

单击时调用一个函数,在GWT中说“getNamefromID()”,这会对DB进行异步调用,在onSuccess()函数中,调用一个会提示名称的函数

public void getNamefromID(int-ID){
字符串姿势=”http://mani/getName";
String requestData=“q=ID”;
RequestBuilder=newrequestbuilder(RequestBuilder.POST,
姿势);
builder.setHeader(“访问控制允许原点”、“*”);
试一试{
builder.sendRequest(requestData.toString(),new RequestCallback()){
公共作废申报人(申请、可丢弃e){
Window.alert(如getMessage());
}
收到响应时公共无效(请求,
回应(回应){
if(200==response.getStatusCode()){
alert(“Name:+response.getText());
}否则{
警报(“收到的HTTP状态代码不是200:”
+response.getStatusText()
+“状态代码:”
+response.getStatusCode());
}
}
});
}捕获(请求异常e){
//无法连接到服务器
Window.alert(如getMessage());
}
}
来自:

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调用是异步调用,因此它将尝试在t之前返回tags.size
Service called!
Last message