11

Web サービスを呼び出して応答を返す関数を実装する必要があります。

私は試した

public String getFolderJson(String path) {  
           String result="initial_value";
           StringBuilder param = new StringBuilder();  
           param.append("?sessionId=").append(getSessionId());  
           param.append("&path=").append(path);  
           RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, "https://localhost/folder" + param);  
                   try {  
                        builder.sendRequest(null, new RequestCallback() {  
                        @Override  
                        public void onResponseReceived(Request request,
                                Response response) {  
                              result = response.getText();
                              System.out.println(response.getText());  
                                            //I need to return "result"   
                        }  
                        @Override  
                        public void onError(Request request, Throwable exception) {}  
                          });  
                    return result; //the result get returned before the response is recieved.So i am getting the return value "initial_value".
                   }      
                   catch (RequestException e) {}  
        return null;
    }

getFolderJson()Web サービスを呼び出すと 、正常に呼び出されます。しかしresult、応答が受信される前に返されます。したがって、戻り値「initial_value」を取得しています。
関数のときに応答から値を返す方法はgetFolderJson()?

4

3 に答える 3

7

GWT は同期 Ajax をサポートしていないため、非同期パターンを使用してアプリをコーディングする必要があります。

GWT が要求を実行するために使用する低レベル オブジェクトはXMLHttpRequest (古い IE バージョンを除く) であり、GWT は常にopen()async を true に設定してそのメソッドを呼び出します。したがって、同期 ajax を持つ唯一の方法は、独自の修正バージョンの を維持することですXMLHttpRequest.java。しかし、同期 ajax は悪い考えであり、jQuery でさえこの可能性を非推奨にしています。

したがって、gwt での通常の方法は、メソッドが を返しvoid、応答が利用可能になったときに実行するコールバックを含む追加のパラメーターを渡すことです。

public void getFolderJson(String path, Callback<String, String> callback) {  
    RequestBuilder builder = new RequestBuilder(...);
    try {
      builder.sendRequest(null, new RequestCallback() {  
        @Override  
        public void onResponseReceived(Request request, Response response) {
          callback.onSuccess(response.getText());  
        }  
        @Override  
        public void onError(Request request, Throwable exception) {}
          callback.onFailure(exception.getMessage());  
        });
    } catch (RequestException e) {
        callback.onFailure(exception.getMessage());  
    }  
}

リクエストビルダーの代わりに、これには gwtqueryPromises構文が必要です。

  Ajax.get("http://localhost/folder?sessionId=foo&path=bar")
    .done(new Function(){
      public void f() {
        String text = arguments(0);
      }
    });
于 2013-03-16T07:37:49.433 に答える
1

I guess the builder.sendRequest(xxx) will return something like a Future,and you can get the result from that object.What you are using is an asynchronous method of RequestBuilder,there should be some synchronous method as well.

what does RequestBuilder come from? I can check the api for you.

OK,try this:

public String getFolderJson(String path) {
    String result = "initial_value";
    StringBuilder param = new StringBuilder();
    param.append("?sessionId=").append(getSessionId());
    param.append("&path=").append(path);
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
            "https://localhost/folder" + param);
    final SynchronousQueue resultQueue = new SynchronousQueue();
    try {
        builder.sendRequest(null, new RequestCallback() {
            @Override
            public void onResponseReceived(Request request,
                    Response response) {
                resultQueue.put(response.getText());
                System.out.println(response.getText());
            }

            @Override
            public void onError(Request request, Throwable exception) {
            }
        });
        return resultQueue.take();
    } catch (RequestException e) {
    }
    return result;
}

It seems RequestBuilder does not have any Synchronous method to get the result only a callback.

Be careful this method will block until the response is recieved. If this method is called in an event processing thread of gwt,this would be a bad practice.

于 2013-03-16T06:11:00.563 に答える