2011-02-13 5 views
1

GWTでWebアプリケーションをコーディングしています。私は、すべてのHTTPリクエストを処理し、サーバーの応答を返すクラスを持っています。 これは私の現在のコードです:私はそれが最初の文字列を返し、その後、それはtry本体にコードを実行HttpRequestのメソッドを呼び出すと(変数messageXmlは定数として定義される)tryブロック戻りコード本体コード実行前の文字列

try { 

     Request request = builder.sendRequest(requestData, new RequestCallback() { 

      @Override 
      public void onResponseReceived(Request request, Response response) { 
       if(200 == response.getStatusCode()) { 
        messageXml = response.getText(); 

       } 
       else { 
        Window.alert("There was an error (1) :-("); 
        messageXml = "ERROR"; 

       } 
      } 


      @Override 
      public void onError(Request request, Throwable exception) { 
       Window.alert("There was an error (2) :-("); 
       messageXml = "ERROR"; 

      } 
     }); 
     Window.alert(messageXml); 
     return messageXml; 
    } 
    catch (RequestException e) { 
      Window.alert("Could not connect to the server :-("); 
      return "ERROR"; 
     } 

。例えば 私は:

request object = new request(); 

    String test = object.httpRequest(file, type, requestData); 
    Window.alert(test); 

それは最初のヌルを出力する(文字列はまだコンテンツを持っていないため)、文字列の内容その後。誰かが、このメソッドがなぜこのように動作するのか知っていますか?

+1

を - しかし、あなたはそれに値を代入しています! –

答えて

3

messageXmlが定数として定義されているかどうかは問題ではありません。 Request#sendRequest()は非同期操作なので、messageXmlに値が割り当てられているときは何も仮定できません。詳細については、GWTのGetting Used to Asynchronous Callsを参照してください。 Request#sendRequest()を使用するための正しい方法はコールバックを使用することです:

public void getMessageXml(String requestData, 
          final AsyncCallback<String> callback) { 
    try { 
    // Modify for your application. 
    RequestBuilder rb = new RequestBuilder(Method.GET, 
     "http://www.mycompany.com/getMessageXml"); 

    rb.sendRequest(requestData, new RequestCallback() { 
     @Override 
     public void onError(Request request, Throwable caught) { 
     callback.onFailure(caught); 
     } 

     @Override 
     public void onResponseReceived(Request request, Response response) { 
     if (Response.SC_OK == response.getStatusCode()) { 
      callback.onSuccess(response.getText()); 
     } else { 
      // Use a correctly typed exception here. 
      callback.onFailure(...); 
     } 
     } 
    }); 
    } catch (RequestException rex) { 
    callback.onFailure(rex); 
    } 
} 

そしてメソッドを呼び出すために:「変数messageXmlは定数として定義されている」

object.getMessageXml(someRequestString, new AsyncCallback<String>() { 
    @Override 
    public void onFailure(Throwable caught) { 
    // Handle error. 
    } 

    @Override 
    public void onSuccess(String messageXml) { 
    // Process response 
    } 
}); 
+0

ありがとう!問題が解決しました。 –

+0

私は助けてうれしいです。 –

関連する問題