С визуальной точки зрения
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;
}
});
}
Распределяя работу между несколькими насосами цикла событий браузера, вы избегаете ситуации, когда веб-приложение перестает отвечать на запросы, если есть нетривиальный объем работы.