Вопрос по – код после Gwt rpc AsyncCallbak не будет выполнен?

1

Я не могу понять, почему код после gwt rpc AsyncCallback не будет выполнен?

например, у меня интерфейс AppService расширяет RemoteService, поэтому у меня будет AsyncAppService, который выполняет асинхронный вызов.

следующий код

<code>            AppServiceAsync service = GWT.create (AppService.class);
        service.getCurrentUser(new AsyncCallback<Employee>(){

            public void onFailure(Throwable caught) {

            }

            public void onSuccess(Employee result) {
                currentUser = result;
            }

        });
 // if i have the code after the above call, these code will not be execute, what is the problem
//code following will not be executed if they are in the same function.
    boolean isAdmin = false;
        if(currentUser!=null){
            if(currentUser.getUserRole().equals("ROLE_ADMIN") ||
                    currentUser.getUserRole().equals("ROLE_MANAGER")){
                isAdmin = true;
            }
        }
</code>

Спасибо за ваше объяснение

Ваш Ответ

2   ответа
1

что вы являетесь брокером на не компьютеризированном фондовом / товарном рынке в старые времена. Давайте представим, что он функционирует следующим образом.

Понедельник 9:30 утра. Вы запланировали это последовательно. На самом деле, вы настолько опытны, что запрограммированы в вас:

Программа BuyAlBanySteel (500):

You want to make a call to buy 500 AlbanySteel. Pass the call board which will be circulated around the trading floor. When call board returns with the offer and offer is agreeable to you, approach offeror to buy the stock.

Программа "Пей кофе"

Pour Coffee Drink coffee.

Предостережение, с которым вам придется иметь дело: получение ответа на звонок занимает не менее 10 минут или даже часа. Это асинхронный. У вас есть идея, сколько времени это займет, но это не точно.

Так что это ваш план в последовательности на утро:

execute BuyAlBanySteel(500) Drink coffee.

Позвольте мне спросить вас, как бы вы структурировали рабочий процесс? Вы бы структурировали это так? Допустим, каждая задача занимает у вас блоки по одной минуте.

9.31 am
Send offer(
  buy = 500 AlbanySteel
  messenger = annie
  When annie comes back, analyse offer.
  Pour Annie a cup of tea.
)

9.32 am
if (annie has an agreeable offer) buy 500 AlbanySteel.

9.33 am
Pour Coffee.

9.34
Drink Coffee.

Конечно, вы не можете. Причина в следующей строке

9.32 am
if (annie has an agreeable offer) buy 500 AlbanySteel.

не будет выполняться должным образом. Похоже, что это не было выполнено, потому что Энни еще не пришла бы с предложением. Чтобы вернуться с предложением, ей может потребоваться еще 10 минут или час.

Итак, вот как вы должны выполнить свой рабочий процесс

9.31 am
Send offer(
  buy = 500 AlbanySteel
  messenger = annie
  when annie comes back,
  analyse offer.
  Pour Annie a cup of tea.
  if (annie has an agreeable offer) buy 500 AlbanySteel.
)

9.33 am
Pour Coffee.

9.34
Drink Coffee.

Итак, какой псевдокод GWT вы бы выбрали для выполнения?

Вы бы выполнить это:

BuyAlbanySteelAsync albanyService = GWT.create(BuyAlbanySteel.class);

albanyService.getOffer(
  new Task<Annie>(){
    onFailure(Annie){Do nothing}

    OnSuccess(Annie){
       analyse offer.
       Pour Annie a cup of tea.
    }
  }
);

if(Annie has agreeable offer)
  buy the stock.


Или это:

BuyAlbanySteelAsync albanyService = GWT.create(BuyAlbanySteel.class);

albanyService.getOffer(
  new Task<Annie>(){
    onFailure(Annie){Do nothing}

    OnSuccess(Annie){
       analyse offer.
       Pour Annie a cup of tea.
       if(Annie has agreeable offer)
         buy the stock.
    }
  }
);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded lhuang
5

е будет ждать при вызовеservice.getCurrentUser, Программа перейдет к следующей строке (boolean isAdmin = false) а такжеit will be true for some time тот(currentUser == null) пока методgetCurrentUser выполняется. Вы должны переместить невыполненный блок кода вonSuccess обработчик

Этот пример должен выглядеть примерно так:

service.getCurrentUser(new AsyncCallback<Employee>(){

    public void onFailure(Throwable caught) {

    }

    public void onSuccess(Employee result) {
        currentUser = result;
        if (currentUser != null) {
            if (currentUser.getUserRole().equals("ROLE_ADMIN") ||
                currentUser.getUserRole().equals("ROLE_MANAGER")) {
                isAdmin = true;
            }
        }

    }

});

Я предполагаю, что currentUser и isAdmin являются полями класса, но не локальными переменными. ЕслиisAdmin является локальным, чем вы можете обернуть эту переменную в окончательный массив:final boolean[] isAdmin = new boolean[1] и называть это какisAdmin[0]

Error: User Rate Limit Exceeded lhuang
Error: User Rate Limit Exceeded lhuang
Error: User Rate Limit Exceededen.wikipedia.org/wiki/Closure_(computer_science)Error: User Rate Limit Exceededcode.google.com/p/google-web-toolkit-doc-1-5/wiki/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы