2016-07-12 7 views
3

Я использую resty gwt для всей связи с сервером. Мне нужен какой-то индикатор, который покажет, что операция продолжается.Пользовательский обратный вызов Resty-GWT при запуске и окончании async

Я считаю 2 aproaches:

  • ProgressBar, который покажет в процентном прогрессе;
  • анимация, которая будет отображаться во время работы, но без какого-либо преимущества.

Я предположил, что мне нужно добавить специальный фильтр с обратным вызовом. Я хотел бы активировать такие мероприятия, как: RestyGwtComunicationStart и RestyGwtComunicationEnd, или обратный вызов для разгона onComunicationStarted и onComunicationEnded. Я хотел бы, чтобы это было объявлено в одном месте, RestyGWT Dispatcher configuration. Также, если была ошибка, я хотел бы получить ошибку.

Но я не знаю с чего начать. Об этом в документах нет.

Могу я попросить вас о помощи? Как я могу это сделать?

+0

Просьба уточнить, что вы хотите сделать. Вам нужна информация о прогрессе (10%, 20% и т. Д.), Или вам нужно только знать, что отправлен конкретный запрос? –

+0

Оба будут замечательными: D, но на данный момент простейшим решением будет достаточно. – masterdany88

ответ

0

К сожалению, я не получил адекватный ответ, поэтому я разработал свое собственное решение.

В первый я добавил конфигурацию Resty RestyGwtConfig в моей конфигурации

public class ClientModule extends AbstractPresenterModule { 
    @Override 
    protected void configure() { 
     bind(RestyGwtConfig.class).asEagerSingleton(); 
     install(new DefaultModule.Builder() 
     .defaultPlace(Routing.HOME.url) 
     .errorPlace(Routing.ERROR.url) 
     .unauthorizedPlace(Routing.LOGIN.url) 
     .tokenFormatter(RouteTokenFormatter.class).build()); 
     install(new AppModule()); 
     install(new GinFactoryModuleBuilder().build(AssistedInjectionFactory.class)); 
     bind(ResourceLoader.class).asEagerSingleton(); 
    } 
} 

модуля, то я настроил на заказ distpatcher для всех моих Comunication запросов Resty GWT.

import org.fusesource.restygwt.client.Defaults; 
import org.fusesource.restygwt.client.Resource; 
import pl.korbeldaniel.cms.shared.ServiceRouting; 
import com.google.gwt.core.client.GWT; 
import com.google.inject.Inject; 

public class RestyGwtConfig { 
    @Inject 
    public RestyGwtConfig(RestyDispatcher dispatcher) { 
     Defaults.setDispatcher(dispatcher); 
    } 
} 

Затем я добавил пользовательский фильтр (ProgressIndicatorFilter) для обработки коммуникационном начала и конечных обратных вызовов:

import org.fusesource.restygwt.client.Method; 
import org.fusesource.restygwt.client.dispatcher.DefaultFilterawareDispatcher; 
import com.google.gwt.http.client.Request; 
import com.google.gwt.http.client.RequestBuilder; 
import com.google.gwt.http.client.RequestException; 
import com.google.inject.Inject; 

public class RestyDispatcher extends DefaultFilterawareDispatcher { 
    @Inject 
    public RestyDispatcher(ProgressIndicatorFilter progressIndicatorFilter) { 
     addFilter(progressIndicatorFilter); 
    } 
} 

в методе класса фильтра перекрываться filter Я добавил триггера события (eventBus.fireEvent(new IndicatorEvent("Rest-Gwt Comunication started"));) и зарегистрированный обратный вызов, вот целый код:

import org.fusesource.restygwt.client.Method; 
import org.fusesource.restygwt.client.dispatcher.DispatcherFilter; 
import pl.korbeldaniel.cms.client.template.progressIndicator.IndicatorEvent; 
import com.google.gwt.http.client.RequestBuilder; 
import com.google.inject.Inject; 
import com.google.web.bindery.event.shared.EventBus; 

class ProgressIndicatorFilter implements DispatcherFilter { 
    private AssistedInjectionFactory factory; 
    private EventBus eventBus; 

    @Inject 
    public ProgressIndicatorFilter(AssistedInjectionFactory factory, EventBus eventBus) { 
     this.factory = factory; 
     this.eventBus = eventBus; 
    } 
    @Override 
    public boolean filter(Method method, RequestBuilder builder) { 
     builder.setCallback(factory.createProgressIndicatorCallback(method)); 
     eventBus.fireEvent(new IndicatorEvent("Resty-Gwt Comunication started")); 
     return true; 
    } 
} 

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

new ProgressIndicatorDispatcherCallback()

причине я использую инъекции зависимостей. Таким образом, я создал фабрику, чтобы помочь инъекции следующим образом:

public interface AssistedInjectionFactory { 
    ProgressIndicatorDispatcherCallback createProgressIndicatorCallback(Method method); 
} 

Here и here Вы можете найти более Ассоциированные данные Injection.

Вот код обратного вызова:

class ProgressIndicatorDispatcherCallback implements RequestCallback { 
    private RequestCallback requestCallback; 
    private EventBus eventBus; 

    @Inject 
    public ProgressIndicatorDispatcherCallback(@Assisted Method method, EventBus eventBus) { 
     this.requestCallback = method.builder.getCallback(); 
     this.eventBus = eventBus; 
    } 
    @Override 
    public void onResponseReceived(Request request, Response response) { 
     endComunicationFireIvent(); 
     requestCallback.onResponseReceived(request, response); 
    } 
    @Override 
    public void onError(Request request, Throwable exception) { 
     endComunicationFireIvent(); 
     requestCallback.onError(request, exception); 
    } 
    private void endComunicationFireIvent() { 
     eventBus.fireEvent(new IndicatorEvent("Rest-Gwt Comunication ended")); 
    } 
} 
0

Так что если вы хотите знать, что запрос был отправлен, вам нужно в вашем приложении GWT обработать это. Вы можете отправить событие при запуске запроса. У вас есть несколько способов сделать это.

Посмотрите на заказ Dispatcher внутри док https://resty-gwt.github.io/documentation/restygwt-user-guide.html

Тогда, если вы хотите, чтобы получить информацию о ходе работы, так как HTTP вызовы являются синхронными. Таким образом, нет никакого способа сделать это легко.

так, как я делал это выглядит следующим образом:

1) Создание первого вызова, чтобы инициировать обработку на внутреннем интерфейсе с POST, это вернет идентификатор вашей обработки

2) Затем выполните GET на вашем идентификаторе обработки, который вернет прогресс. После того, как прогресс 100% он возвращает идентификатор результата

3) получить результат с результатом ID

(Вы можете смешать 2 и 3 вместе в конечном счете и возвращать результат, когда прогресс в 100% же DTO)

Другой вариант заключается в замене 2), нажав информацию от внутреннего интерфейса к переднему концу (html5 WebSocket)

+0

Я знаю, как работает http. Мне нужно решение, которое будет работать с resty-GWT api. Существует специальный фильтр-механизм, в котором мне нужно запускать события. – masterdany88

+0

btw этот запрос тяги приходит от старого товарища по команде :) –

0

Кто-то уже сделал это в качестве тяговой-запроса на Resty. Думаю, вы можете дать ему попробовать:

https://github.com/resty-gwt/resty-gwt/pull/151

+0

Это действительно старый. – masterdany88

+0

Хорошо, что мы сделали, создается Провайдер для клиентских услуг, и поставщик обертывает все вызовы и AsyncCallbacks. Возможно, просто нет простого решения. –

+0

Можете ли вы поделиться простейшим примером кода? – masterdany88

0

К сожалению функция «Диспетчерские/Обратный звонок фильтры» не описаны в официальной документации. Но я могу предложить следующее решение (этот код должен быть помещен в реализации EntryPoint вашего модуля):

public void onModuleLoad() { 
    //... 

    //used to show busy indicator before send HTTP request   
    DispatcherFilter busyIndicatorDispatcherFilter = new DispatcherFilter() { 
     @Override 
     public boolean filter(Method method, RequestBuilder builder) { 
      BusyIndicator.show(); 
      return true; 
     } 
    }; 
    //used to show busy indicator after HTTP response recieved 
    CallbackFilter busyIndicatorCallbackFilter = new CallbackFilter() { 
     @Override 
     public RequestCallback filter(Method method, Response response, RequestCallback callback) { 
      BusyIndicator.hide(); 
      return callback; 
     } 
    }; 
    //registering FilterawareDispatcher (and busy indicator filters) as default Dispatcher 
    Defaults.setDispatcher(new DefaultFilterawareDispatcher(
      busyIndicatorDispatcherFilter, 
      new DefaultDispatcherFilter(new DefaultCallbackFactory(busyIndicatorCallbackFilter)))); 

    //... 
} 
+0

Ваш ответ был лучшим. – masterdany88

 Смежные вопросы

  • Нет связанных вопросов^_^