Использование планировщика GWT - PullRequest
26 голосов
/ 27 февраля 2011

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

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

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

1 Ответ

42 голосов
/ 27 февраля 2011

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

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

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

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

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

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

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

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

...