Я использую 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() неприемлемо.
Вы должны определить индивидуальные обратные вызовы для последовательных запросов, которые вы делаете на сервер. Потому что вы никогда не узнаете, какой запрос обрабатывается первым и возвращается обратно клиенту. Это зависит от вида обработки, которую вы выполняете на своей стороне сервера. Поэтому, чтобы ответить на ваш вопрос, обратные вызовы не реализованы в том порядке, в котором они отображаются в коде.
В качестве подсказки ваш метод вызова сервера должен выглядеть примерно так:
void serverCall(String inputParam) {
if(inputParam.startsWithText.equals("changeRep")
processChangeRepInput(inputParam);
}
И функции processChangeRepInput должны определять обратный вызов по методу onSuccess, вы можете сделать вызов другому методу, например processGitInput(), который inturn определяет свой собственный обратный вызов, а в методе onSuccess вы можете сделать вызов для следующего обновления базы данных на стороне сервера что вы хотели бы сделать.
Я думаю, что вам не хватает самой важной части.
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 асинхронный код будет выглядеть как головоломка обратных вызовов