Как отложить вызов в базу данных от gwt?

1

Я использую gwt + java. Приложение работает с несколькими базами данных. Проблема заключается в том, что запрос быстрее, чем изменение базы данных процесса, что является причиной того, что данные неверны в ui. Как я могу сделать задержку?

reps.addChangeHandler(new ChangeHandler() {
    public void onChange(ChangeEvent event) {
    final String repPath = reps.getValue(reps.getSelectedIndex());
        RootPanel.get("loadingbarImg").setVisible(true);    
        reps.setEnabled(false);
//next line change database
        serverCall("changeRep" + repPath);
 //then I update the tables "git" and "bugs"   
        serverCall("git");
        serverCall("bugs");
        reps.setEnabled(true);
    }
}
);

Метод serverCall() не возвращает никакого значения. Это клиентская сторона gwt, поэтому Thread.sleep() неприемлемо.

Теги:
gwt

2 ответа

1
Лучший ответ

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

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

void serverCall(String inputParam) {
   if(inputParam.startsWithText.equals("changeRep")
       processChangeRepInput(inputParam);
}

И функции processChangeRepInput должны определять обратный вызов по методу onSuccess, вы можете сделать вызов другому методу, например processGitInput(), который inturn определяет свой собственный обратный вызов, а в методе onSuccess вы можете сделать вызов для следующего обновления базы данных на стороне сервера что вы хотели бы сделать.

2

Я думаю, что вам не хватает самой важной части.

GWT - клиент-серверное приложение. JavaScript полностью асинхронный. Поэтому приложение будет выполнять асинхронный вызов в serverCall("changeRep" + repPath); Следующий вызов может быть выполнен сразу же после этого и до того, как сервер выполнит ваш "changerep" -call

Если вам необходимо обеспечить заказ, вам необходимо реализовать асинхронный обратный вызов:

http://www.gwtproject.org/doc/latest/DevGuideServerCommunication.html

Обновить

serverCall("firstaction",new AsyncCallback(){

    public void onSuccess(Void v /*or what ever*/){
        serverCall("secondaction" /*need firstaction to be finished*/, 
                   callBackForSecondaction);
    }

    public void onError(Exception e){
        // Make some errorhandling
    }
});

В этом случае второе действие будет выполнено только в том случае, если первый из них был успешно завершен. До Java8 асинхронный код будет выглядеть как головоломка обратных вызовов

  • 0
    извините, метод serverCall уже реализует обратный вызов. Так вы имеете в виду, что я должен сделать еще один serverCall, чтобы убедиться, что база данных изменена? Всегда ли реализованы обратные вызовы для того, чтобы они появлялись в коде?
  • 0
    Метод serverCall выполняет различные асинхронные обратные вызовы в соответствии с параметром строки. Так что я могу добавить контрольный обратный вызов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню