Подтвердить что ты не робот

Использование планировщика GWT

Мне сложно понять разницу между различными методами интерфейса com.google.gwt.core.client.Scheduler, в частности, методами scheduleDeferred, scheduleFinally и scheduleIncremental.

Мне мешает, насколько мне известно, мое незнание с циклом обработки событий браузера, к которому относится документация Планировщика.

Не могли бы вы объяснить, как эти методы отличаются друг от друга и как они работают в отношении цикла событий браузера?

4b9b3361

Ответ 1

JavaScript (в браузере) является однопоточным. Модель цикла событий означает, что мы всегда находимся в одном из двух состояний:

  • в цикле событий
  • выполнение обработчика событий

Существует много видов событий: события Click, события onload, события XHR, события таймера,... вам придется объявлять некоторые обработчики (по крайней мере, один во время загрузки страницы), иначе ни один из ваших кодов никогда не будет казнены. Один из них - это обработчик, который вы указываете, реализуя onModuleLoad.

Важно, чтобы все обработчики были короткими, потому что там нет parallelism и никаких прерываний (за исключением последнего "прерывания script" прерывания). Это означает, что пользователи не могут взаимодействовать с интерфейсом, пока браузер не вернется в цикл событий - и это не произойдет до завершения текущего обработчика.

Итак, если вы хотите отложить некоторый код до тех пор, пока у других обработчиков событий не появится шанс, вы можете использовать Scheduler.scheduleDeferred.

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

Scheduler.scheduleFinally просто означает: после обработки нашего текущего обработчика (даже если возникает исключение), но перед возвратом в цикл событий выполните мою команду.

См. com.google.gwt.core.client.impl.Impl.entry0()