Eventbus порядок событий - PullRequest
       9

Eventbus порядок событий

4 голосов
/ 11 ноября 2011

Утро

Я использую шину SimpleEvent для отправки данных из моего централизованного средства восстановления данных в виджеты. Это работает очень хорошо, я получаю один набор новых данных с сервера, метод успеха вызова RPC помещает их в Eventbus, каждый виджет ищет данные для них, если да, то «отображает» их, если нет, он ничего не делает. Существует только один набор данных на запрос, и виджеты не зависят от других данных, которые уже отправлены.

Теперь у меня есть виджет Tree. Дочерние узлы дерева создаются и для этих наборов данных, и эти дочерние узлы регистрируются в Eventbus для восстановления данных для своих дочерних узлов. Данные должны быть получены в срочном порядке (по соображениям производительности), поэтому я получу несколько наборов данных, которые будут помещены в шину Eventbus одновременно (в цикле for). Я контролирую только порядок, в котором они там находятся (сначала корень, затем данные для первого ребенка ......). Как Eventbus теперь обрабатывает события?

  • Ожидает ли он, пока первое событие не будет завершено, поэтому первый ребенок дерево уже завершено создание и зарегистрировать себя в Eventbus, чтобы оживить данные, чтобы создать его ребенка.
  • Он обрабатывает их одновременно, поэтому виджет даже не регистрируется в Eventbus.
  • Он перепутал заказ?!?!

Подходы к текущему решению:

  1. Лучшее решение, которое я могу придумать, - это помещать только новые события в Eventbus, когда предыдущий закончен. Однако я нашел способ который делает это, или если это стандартное поведение Eventbus.
  2. Запустить событие обработки запроса, когда событие было обработано виджетом. Удачи ... это приводит к большому количеству дополнительного кода и вызывает большие проблемы, когда данные помещаются в Eventbus, который не принадлежит ни одному виджету ....
  3. Зарегистрировать статическую переменную, которая устанавливается в значение true, когда запрос обрабатывается, и Eventbus ждет так долго, пока он не отправит следующий запрос на Eventbus (тихо, как два, но гораздо хуже стиль кодирования и те же проблемы)
  4. Все события обрабатываются корневым элементом дерева, который отправляет их вверх соответствующим дочерним элементам.

Какое решение вы бы предпочли и почему?

С уважением, Stefan

PS: мой любимый ответ: 1. Стандартное поведение Eventbus ^^ PPS: Решение также должно работать при представлении веб-работников.

Ответы [ 2 ]

7 голосов
/ 12 ноября 2011

EventBus#fireEvent является синхронным.Это по замыслу.Вы можете передать событие в шину, иметь обработчики, возможно, изменить его, и когда выполнение вернется к вашему методу, вы можете проверить событие;это используется для PlaceChangeRequestEvent и setMessage, например.

К вашему сведению, если обработчик выдает исключение, это не помешает выполнению других обработчиков.fireEvent затем обернет исключения (множественное число; несколько обработчиков могут выдать) в UmbrellaException.

3 голосов
/ 11 ноября 2011

Несмотря на то, что EventBus - хороший способ разъединить части вашего приложения, это не означает, что его следует использовать «чрезмерно».
Я также думаю, что вы должны быть осторожны, чтобы не обойти асинхронное поведение вашего клиентского кода путем введения синхронного / блокирующего поведения.

Javascript является однопоточным, поэтому я не думаю, что вы можете иметь два события одновременно. Они будут казнены один за другим. Если вы инициируете событие в EventBus (то есть SimpleEventBus ), оно просто выполняет итерацию по списку подключенных обработчиков и выполняет их. Если обработчик не подключен, ничего не происходит.

Я лично предпочел бы 4-го. подход, особенно если вы планируете использовать CellTree некоторое время в будущем. Виджет Дерево / Виджет CellTree обрабатывает событие и строит его структуру, проходя через объект.

...