2011-10-10 4 views
0

RPC 결과를 저장하는 데 문제가 있습니다. 기본적으로 호출은 성공적이지만 변수에 저장하려고하면 범위를 벗어나는 것처럼 보입니다.GWT RPC 범위 문제

private String userName = "default"; 

authService.retrieveUserData(new AsyncCallback<UserData>() { 
     @Override 
     public void onSuccess(UserData result) { 
      userName = result.getUserName(); 
      shell.setError("The userName is " + userName + "!"); 
     } 
     @Override 
     public void onFailure(Throwable caught) { 
      //I've checked and it is not failing. 
     } 
    }); 

shell.getLoginWidget().setUserName(userName); 

셸이 내 RootLayoutPanel에 추가 된 복합체입니다. 그것은 InnerText가 shell.setError (String)에 의해 설정된 DivElement를 포함합니다. 쉘에는 또한 InnerText가 shell.getLoginWidget(). setUserName (String)에 의해 설정된 SpanElement가있는 LoginWidget이 있습니다. userName은 분명히 "default"로 초기화되는 String입니다.

문제는 shell.setError ("사용자 이름은"+ userName + "!")입니다. (AsyncCallback 내부)는 현재 로그인되어있는 사람에게 InnerText를 설정합니다. 그러나 shell.getLoginWidget(). setUserName (userName); (AsyncCallback 외부)는 InnerText를 "default"로 설정합니다.

나는 많은 다른 것들을 시도했으며 모두 동일한 범위 문제가있는 것처럼 보입니다. 실제로 나를 혼란스럽게하는 것은 this 예제는 RPC 결과를 저장하는 것과 거의 똑같은 기술을 보여줍니다.

답변

1

GWT RPC 메서드는 asynchronous입니다. 반환 값은 즉시 사용할 수 없습니다. 다음과 같이 게시 된 코드에 대한 제어의 흐름은 다음과 같습니다

  1. 설정 userName에 "기본".
  2. UserDataauthService으로 문의하십시오. 이것은`UserData에 대한 비동기식 XMLHttpRequest을 시작합니다.
  3. 로그인 위젯의 userName을 "default"인 userName의 현재 값으로 설정하십시오.
  4. 잠시 후 2 단계에서 시작된 비동기 요청이 반환되어 userName 변수가 반환 된 값으로 설정됩니다.

    public void onSuccess(UserData result) { 
        userName = result.getUserName(); 
        shell.getLoginWidget().setUserName(userName); 
    } 
    
    :

할 올바른 것은 AsyncCallbackonSuccess 방법에 사용자 이름을 설정하는 것입니다