3

GWT には、リクエストの fire メソッドを使用して DB から DATA を取得するメソッドがあります。非同期であることはご存知のとおりです。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メソッドを呼び出してDBからデータを取得する必要がありますが、同期的に!

HTML ボタンがあり、クリックすると ID が関数に渡され、GWT を介して DB から名前を取得して警告する必要があります。GWT は非同期であるという理由だけで、毎回そうすることができず、結果を警告すると、まだ満たされていないため空になります。

4

4 に答える 4

6

ネイティブ 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;
}-*/; 

それが良いアイデアかどうかを議論しているわけではないことに注意してください。おそらく Async に固執し、成功イベントにアラートを出す必要があります。

于 2012-06-23T10:17:46.350 に答える
3

GWT では、サーバーへの同期呼び出しを許可していません。これは、ブラウザーが応答を受け取るまでブラウザーをハングさせる可能性があるためです。onSuccessイベントハンドラ。

私のビジネスニーズは、JS関数にDBからデータを取得させることですが、同期する必要があります

データベースからデータを取得できるのは Java を介して (または他のサーバー側言語を使用して) のみで、JavaScript を使用することはできません。RequestBuilderまたは GWT RPC メカニズムを使用して、GWT から非同期呼び出しを行うだけです。返されたデータは、前述のように、適切なハンドラー内で処理できます。

于 2012-06-23T10:19:12.560 に答える
3

Ahmad、あなたが引用した例を参照してください:

Click で関数を呼び出します。GWT で 'getNamefromID()' と言って、DB への非同期呼び出しを行い、 onSuccess() 関数で、名前を警告する関数を呼び出します。

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());
    }
}
于 2012-06-23T11:53:24.857 に答える
1

https://stackoverflow.com/a/40610733/6017801から:

GWT はXMLHttpRequest.open()を 3 番目のパラメーターとして true を指定して呼び出します。これは、呼び出しが非同期であることを意味します。この 3 番目のパラメーターを常に 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を参照してください。

于 2016-11-15T13:16:59.553 に答える