Как перехватить метод onSuccess () в GWT - PullRequest
1 голос
/ 15 марта 2011

Мне нужно сделать перехват метода для метода onSuccess в GWT.

Мне нужно добавить код до и после вызова метода onSuccess в GWT? (У меня много вызовов метода onSuccess, и мне нужно сделать это динамически)

EDIT: Мне нужно добавить progress bar в правом углу экрана, который появляется, когда код входит в метод onsuccess и исчезает при выходе из метода onsuccess.

Ответы [ 3 ]

1 голос
/ 15 марта 2011

С визуальной точки зрения

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

будет бездействующим.Браузеры обычно ждут, пока обработчики событий завершат выполнение, прежде чем повторно пересылать DOM.Если для выполнения метода doLotsOfWork() требуется значительное количество времени (например,> 100 мс), пользователь заметит сбой браузера из-за однопоточного характера выполнения JavaScript.

Вместо этого рассмотрите возможность использования пошагово запланированная команда , чтобы прекратить работу.Это будет выглядеть примерно так:

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;
    }
  });
}

Распределяя работу между несколькими насосами цикла событий браузера, вы избегаете ситуации, когда веб-приложение перестает отвечать на запросы, если есть нетривиальный объем работы.

1 голос
/ 24 марта 2011

Ну, это общее нефункциональное требование, я провел некоторое исследование по этому пункту, я реализовал решение, которое Томас Бройер предложил для gwt group . Это решение имеет явное преимущество переддругие предлагаемые решения, вам не нужно менять классы обратного вызова, вам нужно просто добавить строку кода после создания асинхронной службы 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()));

     }

}
0 голосов
/ 15 марта 2011

Вы не можете сделать это. Метод rpc onSuccess () работает асинхронно (другими словами, зависит от сервера, когда он завершает, приложение не ждет его). Вы можете запустить код сразу после вызова rpc, который может / не может завершиться до вызова onSuccess для вызовов RPC.

Можете ли вы объяснить, например, почему именно вы хотите это сделать? Возможно, вам придется перепроектировать приложение из-за этого асинхронного поведения, но вы не можете сказать, пока не предоставите вариант использования. Желательно, чтобы любая функция Async была забыта после вызова rpc, и действие выполнялось только в onSuccess.

...