参考异步回调不良做法的响应?

时间:2013-02-25 11:03:11

标签: gwt

今天我在GWT代码中看到了一个方法,如下所示:

public Map< String, ResponseObject > getResponse( RequestObject requestObject ) {
    remoteServiceAsync = GWT.create( RemoteServce.class );
    final Map< String, ResponseObject > responseReference = new HashMap< String, ResponseObject >();

    remoteServiceAsync.doServerCall( requestObject, new AsyncCallback< ResponseObject >() {
      public void onFailure(Throwable caught) {
         // TODO: Do something with errors.
      }

      public void onSuccess( ResponseObject response ) {
        responseReference.put( "value", response );
      }
    } );

    return( responseReference );
};

我认为,这是一种非常糟糕的做法。您对此代码有何看法?它是否适用于所有浏览器,阅读valid是“data”选项吗?我必须提到数据是在程序的后期访问的,因此不缺数据。

2 个答案:

答案 0 :(得分:0)

返回Hashmap非常糟糕的做法。它完全打破RPC advantages

在该方法中,它会立即返回empty hash-map,然后返回插入Map的值的(remoteServiceAsync!=null),这是没用的。

并初始化

甚至没有检查remoteServiceAsync = GWT.create( RemoteServce.class ); 下面的行

{{1}}

所以它会为每个电话初始化。

答案 1 :(得分:0)

这里有两点需要强调 -

1)我们不知道异步调用何时返回,因此,我们可以使用return语句返回从RPC返回的对象。因此,responseReference将始终为空。

2)每次我们需要触发异步调用时,我们都不需要创建RPC实例。因此,建议在此类场景中使用Singleton模式。

您的代码段可以按以下方式重构 -

ServiceAsync serviceasync = null;

getServiceAsync()
{
     if(serviceAsync == null)
     {
         serviceAsync = GWT.create( RemoteServce.class );
     }
     return serviceAsync;
}

AsynCallBack asyncCallBack;

getAsyncCallBack()
{
      if(asynvCallback != null)
      {
           return asyncCallback;
      }
      return new AsyncCallback< ResponseObject >() 
            {
                  public void onFailure(Throwable caught) 
                  {
                       // TODO: Do something with errors.
                  }

                   public void onSuccess( ResponseObject response ) 
                   {
                        // Do processing here with the response object ...
                   }
            } );    
}

现在调用getResponse()方法的地方用以下方法替换该方法调用 -

getServiceAsync().doServerCall( requestObject, getAsyncCallBack() );

因此,只有一个服务实例和一个asyncCallBack实例。避免了创建多个对象,从而增加了性能。