GWT同步调用,(GWT Synchronous call)

2019-07-30 02:05发布

我在GWT的方法使用要求的火法大家都知道它的异步我打电话从JS这个方法,所以我需要做同步,才有可能以检索从数据库的数据

private static String retriveLocation(String part)
{
    ClientFactory clientFactory = GWT.create(ClientFactory.class);
    MyRequestFactory requestFactory = clientFactory.getRequestFactory();
    YadgetRequest request = requestFactory.yadgetRequest();
    String criteria = "!" + part;
    final ArrayList<String> tags = new ArrayList<String>();

    request.getTagsStartingWith(criteria, 10, 0).fire(
            new Receiver<List<TagProxy>>() {
                @Override
                public void onSuccess(List<TagProxy> tagList) {
                    String output = "[";

                    for (TagProxy pt : tagList) {
                        output += "{";
                        output += "\"id\":" + "\"" + pt.getId() + "\",";
                        output += "\"value\":"
                                + "\""
                                + pt.getName().replaceAll("\"", "")
                                        .replaceAll("!", "") + "\"";
                        output += "},";

                    }
                    if (output.length() > 2)
                        output = output.substring(0, output.length() - 1);
                    output += "]";
                    tags.add(output);

                }

                @Override
                public void onFailure(ServerFailure error) {

                }

            });

    return tags.size() + "";

}

并要求从JS这个函数是这样的:

public static native void exportStaticMethod() /*-{
    $wnd.computeLoanInterest =
    $wnd.getAutocomplete =@com.yadget.client.Yadget::retriveLocation(Ljava/lang/String;);
}-*/;

和内onModuleLoad()我叫exportStaticMethod()

在HTML我有一个按钮,我称之为的onclick getAutocomplete()是这样的:

<input type="button" onclick="alert(getAutocomplete('j'))" value="momo" /> 

问题是,大小总是返回0,因为该方法是异步的,但如果我能返回值onSuccess会解决我的问题。 任何想法吗? 我一直在谷歌上搜索这2天,并没有得到答案。

换一种说法:

我有JS的方法,我需要它来调用Java方法来检索数据库的数据同步,但!

如果我有一个HTML按钮上点击我会把ID的功能,我需要通过GWT从DB retrive的名称,并提醒它; 只是因为GWT是asyncronous,我不会能够所以每次做时,我提醒结果,这将是一个空的,因为它尚未填补。

Answer 1:

您无法使用本机GWT RPC同步。 我不知道这是你的要求,但在这里是如何使同步调用服务器:

private native String makeSyncAjaxCall(String url, String msgText, String conType)/*-{
    var xhReq = new 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;
    return serverResponse;
}-*/; 

请注意,我不是在讨论是否这是一个好主意或没有。 你或许应该坚持使用异步和放警报的成功事件。



Answer 2:

GWT不允许进行同步调用服务器,因为它们可以让你的浏览器挂起,直到它得到响应,所以出于显而易见的原因是最好的,如果你可以改变,使得来自服务器的结果将内部处理流程onSuccess事件处理程序。

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

您只能通过Java(或使用任何其他服务器端语言)获取数据库中的数据,而不是使用JavaScript。 只是让来自GWT使用或者异步调用RequestBuilder或GWT RPC机制。 返回的数据可以比是过程中的适当处理程序内,如上所述。



Answer 3:

艾哈迈德提到的例子中,你引述:

请点击一个功能,GWT,这使得异步调用到数据库,并在的onSuccess()函数说“getNamefromID()”,称这将提醒名称的功能。

public void getNamefromID(int ID) {
    String postUrl = "http://mani/getName";
    String requestData = "q=ID";
    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,
            postUrl);
    builder.setHeader("Access-Control-Allow-Origin", "*");
    try {
        builder.sendRequest(requestData.toString(), new RequestCallback() {
            public void onError(Request request, Throwable e) {
                Window.alert(e.getMessage());
            }

            public void onResponseReceived(Request request,
                    Response response) {
                if (200 == response.getStatusCode()) {
                    Window.alert("Name :" + response.getText());
                } else {
                    Window.alert("Received HTTP status code other than 200 : "
                            + response.getStatusText()
                            + "Status Code :"
                            + response.getStatusCode());
                }
            }
        });
    } catch (RequestException e) {
        // Couldn't connect to server
        Window.alert(e.getMessage());
    }
}


Answer 4:

从https://stackoverflow.com/a/40610733/6017801 :

GWT调用XMLHttpRequest.open()均可进行真作为它的第三个参数,这意味着所述呼叫将是异步的。 我解决了测试的目的只是迫使这第三个参数是始终虚假同样需要:

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

见https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open为XMLHttpRequest.open()规范。



文章来源: GWT Synchronous call