继续

2016-03-07 85 views
1

前等待的AsyncCallback目前,我有以下相关代码片段:继续

public class MyEntryPoint implements EntryPoint { 

    private boolean areFieldsEnabled = false; 

    @Override 
    public void onModuleLoad(){ 
     addFields(); 
    } 

    private void addFields(){ 
     Button button = new Button("Show fields"); 
     button.addClickHandler(new ClickHandler(){ 

      @Override 
      public void onClick(final ClickEvent event){ 
       String entityType = ...; 
       String entityId = ...; 
       checkIfFieldsAreEnabled(); 
       MyEntryPoint.this.fields = new FieldsValuesDiv(entityType, 
        Long.valueOf(entityId), MyEntryPoint.this.areFieldsEnabled); 
       wrapper.add(MyEntryPoint.this.fields); 
      } 
     }); 
    } 

    private void checkIfFieldsAreEnabled(){ 
     this.fieldsService.areValuesEditable(new AsyncCallback<Boolean>(){ 

      @Override 
      public void onFailure(final Throwable caught){ 
       Window.alert(caught.getLocalizedMessage()); 
      } 

      @Override 
      public void onSuccess(final Boolean result){ 
       MyEntryPoint.this.areFieldsEnabled = result; 
      } 
     }); 
    } 
} 

这将导致“查看域”。当我点击这个时,字段GWT组件被加载并显示字段。目前所有的字段默认都是禁用的,即使checkIfFieldsAreEnabled()在它之前完成。当我点击“隐藏字段”按钮(在上面的代码中没有显示),然后再次显示字段按钮,它确实有效。

原因?它不会等待AsyncCallback<Boolean>的结果,所以有时它可以工作,有时它不会,这取决于异步调用的完成速度。我来自C#背景,可以使用async/await。当我搜索一个Java的等价物时,我遇到了this SO answer by Jon Skeet,它基本上表明Java中没有这样的事情。但是,这是从三年前开始的,所以我想知道自那以后有什么变化。

如果没有,有没有人知道我可以等待AsyncCallback<Boolean>其中设置areFieldsEnabled布尔?

+0

答案解决了您的问题吗?如果不是,请你澄清一下吗? – Baz

+0

@巴兹可惜没有。当我读到你的答案时,这是非常明显的,所以我这样实现它,但是这些字段最初仍然是禁用的。虽然我不完全确定问题是什么,目前的优先事项有所改变。这个问题仍然存在,但我们必须在不久的将来解决它,所以当我知道更多关于正在发生的事情时,我会通知你。 –

+0

@Baz我不确定最近几天发生了什么变化,但是现在它在我和其他GWT项目中的其他特性/错误一起工作之后就可以工作了。由于您的解决方案确实是在Java中处理AsynCallback的正确方法,因此我已将它作为答案。 –

回答

3

回调是异步运行的,这意味着您的其他代码(调用后的行)在回调仍然从服务器获取数据时执行。

如果你只想要执行的东西一旦回调返回时,从回调的onSuccess方法调用它:

this.fieldsService.areValuesEditable(new AsyncCallback<Boolean>(){ 

    @Override 
    public void onFailure(final Throwable caught){ 
     Window.alert(caught.getLocalizedMessage()); 
    } 

    @Override 
    public void onSuccess(final Boolean result){ 
     MyEntryPoint.this.areFieldsEnabled = result; 
     // Do whatever needs to be done here 
     MyEntryPoint.this.fields = new FieldsValuesDiv(entityType, Long.valueOf(entityId), MyEntryPoint.this.areFieldsEnabled); 
     wrapper.add(MyEntryPoint.this.fields); 
    } 
}); 

这将确保您尝试访问它之前areFieldsEnabled设置。