【问题标题】:how to centralize "loading" screen for GWT RPC?如何集中 GWT RPC 的“加载”屏幕?
【发布时间】:2010-12-02 04:48:25
【问题描述】:

如何集中管理 GWT 异步 RPC 调用的“加载”图标?我正在寻找一种让每个异步调用自动启动计时器的方法。当计时器触发时,如果 RPC 尚未完成,则应显示“加载”图标。当 RPC 完成时(onSuccess()onFailure())加载图标应该被移除。

每次调用都手动执行此操作很乏味,实际上很容易出错并给用户留下卡住的 UI。

可以为此使用生成器吗?只是要清楚-我不是在寻找显示对话框或图标的代码;我正在寻找一种方法来集中管理这样的对话框/图标。

【问题讨论】:

    标签: gwt asynchronous rpc generator


    【解决方案1】:

    也许我以更简单的方式看待它。但是我们在我们的应用程序中有类似的行为,我们只是使用装饰器模式来实现它。装饰器负责显示正在加载的 UI(在我们的例子中它会立即显示),并在返回时确保再次删除 UI。

    我们的调用看起来有点像这样:

    rpc.dosomething( params, Modality.appModal( new AsyncCallback<String>() {
      public void onSuccess( String pValues ) {
        ... handle success ...
      }
    
      public void onFailure( Throwable pCause) {
        ... handle failure ....
      }
    }));
    

    Modality.appModal 返回一个执行 UI 部分的 AsyncCallback,并在成功或失败后调度到调用中作为参数给出的 AsyncCallback。

    是否值得进一步使用代码生成器?实现一次,随处使用,无需多加思考。

    大卫

    【讨论】:

      【解决方案2】:

      我通过为 ajax 调用创建一个 util 类解决了这个问题。此类包含一个 loadingIndicator 和一个 callstaackloadingIndicator 是将显示消息的 PopupPanelcallstack 是一个静态列表,其中包含所有需要加载指示器的实际 AsyncCallback 对象。当回调发生(成功或错误)时,回调将从列表中删除。只有当列表中没有剩余回调时,加载指示器才会隐藏。

      public class Ajax {
      
          private static final PopupPanel loadingIndicator = WidgetFactory.createLoadingPopup();
          private static final List<AsyncCallback<?>> callstack = new ArrayList<AsyncCallback<?>>();
      
          public static <T> AsyncCallback<T> call(final AsyncCallback<T> callback) {
              if(!loadingIndicator.isShowing()){
                  loadingIndicator.center();
              }
              callstack.add(callback);
              return new AsyncCallback<T>() {
                  @Override
                  public void onFailure(Throwable caught) {
                      handleReturn();
                      callback.onFailure(caught);
                  }
      
                  @Override
                  public void onSuccess(T result) {
                      handleReturn();
                      callback.onSuccess(result);
                  }
      
                  private void handleReturn(){
                      callstack.remove(callback);
                      if(callstack.size() < 1) {
                          loadingIndicator.hide();
                      }
                  }
              };
          }
      }
      

      然后我将它用于需要像这样的加载指示器的所有 RPC 调用:

      myService.myMethod(Ajax.call(new AsyncCallback<MyReturnType>() { 
          @Override
          public void onFailure(Throwable caught) { ... }
      
          @Override
          public void onSuccess(MyReturnType result) { ... }
      }));
      

      【讨论】:

        【解决方案3】:

        您可以在这里找到一些答案:Automatic ‘loading’ indicator when calling an async function

        我同意此页面上的其他人的观点,即不值得为此使用代码生成器。

        【讨论】:

        • 谢谢大卫。我想我在寻找以前提出的问题方面做得不够好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 2020-10-18
        • 2021-06-26
        相关资源
        最近更新 更多