如何拦截GWT中的onSuccess()方法

时间:2011-03-15 09:15:08

标签: gwt aop interceptor

我需要对GWT中的onSuccess方法进行方法拦截。

我需要在GWT中调用onSuccess方法后在和之后添加一些代码? (我有很多调用onSuccess方法,我需要动态地执行此操作)

修改 我需要在屏幕右上角添加progress bar,当代码进入onsuccess方法时会显示onsuccess,并在{{1}}方法退出时消失。

3 个答案:

答案 0 :(得分:1)

从视角来看

void onSuccess(Value v) {
  showProgressBar();
  doLotsOfWork(v);
  hideProgressBar();
}

将是一个无操作。浏览器通常在重新发送DOM之前等待事件处理程序完成执行。如果doLotsOfWork()方法需要花费相当多的时间来执行(例如> 100ms),则由于JavaScript执行的单线程特性,用户会注意到浏览器打嗝。

相反,请考虑使用incrementally-scheduled command来破坏工作。它看起来大致如下:

void onSuccess(Value v) {
  showProgressBar();
  Scheduler.get().scheduleIncremental(new RepeatingCommand() {
    int count = 0;
    int size = v.getElements().size();
    public boolean execute() {
      if (count == size) {
        hideProgressBar();
        return false;
      }
      processOneElement(v.getElements().get(count++));
      setProgressBar((double) count / size);
      return true;
    }
  });
}

通过打破浏览器事件循环的多个泵的工作,可以避免在需要做大量工作的情况下,webapp变得无响应的情况。

答案 1 :(得分:1)

嗯,这是一个通用的非功能性要求,我对这个项目进行了一些研究,我已经实现了Thomas Broyer在gwt group上建议的解决方案。这个解决方案比其他建议的解决方案有明显的优势,您不必更改回调类,您只需在创建async gwt-rpc服务后添加一行代码...

IGwtPersistenceEngineRPCAsync persistenceEngine = GWT.create(IGwtPersistenceEngineRPC.class);
     ((ServiceDefTarget) persistenceEngine).setRpcRequestBuilder(new ProgressRequestBuilder());


import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.rpc.RpcRequestBuilder;

public class ProgressRequestBuilder extends RpcRequestBuilder {

    private class RequestCallbackWrapper implements RequestCallback {

        private RequestCallback callback;

        RequestCallbackWrapper(RequestCallback aCallback) {
            this.callback = aCallback;
        }

        @Override
        public void onResponseReceived(Request request, Response response) {
            Log.debug("onResposenReceived is called");
            // put the code to hide your progress bar
            callback.onResponseReceived(request, response);

        }

        @Override
        public void onError(Request request, Throwable exception) {
            Log.error("onError is called",new Exception(exception));
            // put the code to hide your progress bar
            callback.onError(request, exception);

        }

    }



    @Override  
    protected RequestBuilder doCreate(String serviceEntryPoint) {

        RequestBuilder rb = super.doCreate(serviceEntryPoint);
        // put the code to show your progress bar           
        return rb;  
    }

    @Override
     protected void doFinish(RequestBuilder rb) {
         super.doFinish(rb);
         rb.setCallback(new RequestCallbackWrapper(rb.getCallback()));

     }

}

答案 2 :(得分:0)

你不能这样做。 rpc onSuccess()方法异步运行(换句话说,取决于服务器完成时,应用程序不会等待它)。您可以在rpc调用之后立即触发代码,这可能/可能不会在onSuccess for RPC调用之前完成。

你能解释一下,为什么你想要这样做?由于这种异步行为,你可能不得不重新设计应用程序,但是在你提供用例之前不能说。优选地,在rpc调用之后应该忘记任何异步功能,并且仅在onSuccess中执行操作。