たとえば、以下のコードを確認してみましょう
private void loadUserFromServer() {
dispatchAsync.execute(new FindLoggedUserAction(),
new AsyncCallback<FindLoggerUserResult>() {
@Override
public void onFailure(Throwable caught) {
//do something
}
@Override
public void onSuccess(BuscarUsuarioLogadoResult result) {
//dosomething with user
result.getUser();
}
operationTwo();
}
私の問題は、operationTwo();を実行する必要があることです。dipatcherの何らかの結果(成功または失敗)の後。
これは単なる例です。onSucessまたはonFailure()内にoperationTwo()を配置できないと仮定しましょう。
私の本当の問題
ユーザーがログインしている必要があるプレゼンターの私のGateKeeper。
private UserDTO user;
@Override
public boolean canReveal() {
if(getUser() == null){
ShowMsgEvent.fire(eventBus,"Must Login first", AlertType.ERROR);
return false;
}
return true;
}
}
public UserDTO getUser()
{
if(user == null)
{
//call server
loadUserFromServer();
}
return user;
}
private void loadUsuarioFromServer() {
dispatchAsync.execute(new BuscarUsuarioLogadoAction()
,new AsyncCallback<BuscarUsuarioLogadoResult>() {
@Override
public void onFailure(Throwable caught) {
//something
}
@Override
public void onSuccess(BuscarUsuarioLogadoResult result) {
if(!(result.getDto().equals(user)))
{
setUsuario(result.getDto(), false); //Set user UserDTO user
//event for update Presenter Login/Logout
// and Label with username
fireUserUpdateEvents();
}
else
{
setUsuario(result.getDto(), false);
}
}
});
ご覧のとおり、そのゲートキーパーを持つプレゼンターが呼び出され、ユーザーがnullの場合、getUser()が呼び出されますが、ディスパッチが実行されると、メソッドは成功または失敗が返されるまで待機しません。
結果:getUser()はnullを返します。
ディスパッチが成功した後、getUser()はDTOを返します。しかし、ご覧のとおり、canReveal()はすでにfalseを返しています。