今天我在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
”选项吗?我必须提到数据是在程序的后期访问的,因此不缺数据。
答案 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实例。避免了创建多个对象,从而增加了性能。