1

不明白为什么gwt rpc AsyncCallback之后的代码不会被执行?

例如,我有接口 AppService 扩展 RemoteService,所以我将有 AsyncAppService 来执行异步调用。

以下代码

            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;
            }
        }

谢谢你的解释

4

2 回答 2

5

您应该了解 Async 调用的性质。调用时程序执行不会等待service.getCurrentUser。程序将继续到下一行(boolean isAdmin = false),并且在一段时间内直到(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]

于 2012-04-04T16:19:39.187 回答
1

想象一下,您是过去非计算机化股票/商品市场的经纪人。让我们假设它以下列方式运行。

现在是星期一上午 9.30。您按顺序计划了这些。事实上,你是如此有经验,它被编入你的程序:

程序 BuyAlBanySteel(500):

  1. 您想打电话购买 500 AlbanySteel。
  2. 通过将在交易大厅内流通的呼叫板。
  3. 当呼叫板返回要约并且您同意要约时,请联系要约人购买股票。

程序喝咖啡

  1. 倒咖啡
  2. 喝咖啡。

您必须处理的警告:获得呼叫响应至少需要 10 分钟,甚至一个小时。它是异步的。您知道需要多长时间,但不确定。

所以这是你早上的计划:

  1. 执行 BuyAlBanySteel(500)
  2. 喝咖啡。

让我问你,你会如何组织你的工作流程?你会这样构造吗?假设每个任务需要你一分钟的时间来执行。

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.
    }
  }
);
于 2012-04-05T02:32:29.080 回答