0

canReveal()クラスClientStateにユーザー情報がある場合、関数はtrueを返します。そうでない場合は、最初にへの非同期呼び出しを使用してそのユーザー情報を取得しようとしますGetUser。内部で行う必要があるのIFは、この非同期呼び出しが()を返すまで何とか待つことです。これにより、ユーザー情報があるonSuccessかどうかを確認できます。ClientStateどうやってやるの?ありがとう

public class MyGatekeeper implements Gatekeeper{

private DispatchAsync dispatcher;

@Inject
public MyGatekeeper(DispatchAsync dispatcher) {
        this.dispatcher = dispatcher;
}

@Override
public boolean canReveal() {
    if(ClientState.isUserLoggedin()==false) {
        dispatcher.execute(new GetUser(Window.Location.getHref()),
        new DispatchCallback<GetUserResult>() {
                @Override
                        public void onSuccess(GetUserResult result) {
                if (!result.getErrorText().isEmpty()) {
                     Window.alert(result.getErrorText());
                     return;
                }
                ClientState.setUserInfo(result.getUserInfo());
            }
        });
        return ClientState.isUserLoggedin(); // WAIT till onSuccess returns!
    }
}
    return ClientState.isUserLoggedin();
}
4

1 に答える 1

1

これを行う方法は、 :をcanReveal取ることです。Callback<Boolean>

public void canReveal(Callback<Boolean> cb) {
  if (!ClientState.isUserLoggedIn()) {
    dispatcher.execute(..., new DispatchCallback<Result>() {
      @Override
      public void onSuccess(Result result) {
        cb.onSuccess(result.isGoodOrWhatever());
      }
    });
  } else {
    cb.onSuccess(true); // User is logged in
  }
}

残念ながら、JSはシングルスレッドであるため、非同期コールバックを「待機」するようにGWTに指示する方法はありません。これは、基本的にJSの実行をフリーズするためです。

于 2012-11-05T16:52:31.357 に答える