Цикл событий Javascript / насос сообщений для плагина Google Sketchup - PullRequest
0 голосов
/ 12 апреля 2011

Я работаю над плагином для Google Sketchup, который написан с использованием Ruby API. В этом API есть класс WebDialog , который можно использовать для визуализации HTML и перемещения данных между WebDialog и стороной Ruby кода плагина. Я использую этот класс для создания пользовательского интерфейса для моего плагина.

Данные отправляются из WebDialog на сторону Ruby асинхронно. Из-за некачественной документации я изначально не знал об этом, и теперь, когда я попал в свой плагин, он начал создавать некоторые проблемы для меня. В частности: когда выполняется несколько последовательных вызовов от WebDialog на сторону Ruby, выполняется только последний вызов. Итак, мне явно нужно разработать какой-то «мост», который предотвратит потерю вызовов из WebDialog на сторону Ruby - я думаю, что это, по сути, система «цикл обработки событий» или «прокачка сообщений».

Моя проблема в том, что я понятия не имею, как это сделать. Я надеюсь, что кто-то может предоставить мне какой-то ресурс, который излагает структуру для того, как такая система должна работать - какие проверки необходимы, последовательность, в которой они выполняются, и т. Д. Я знаю это может быть чрезвычайно сложной задачей, но мне нужно только что-то базовое: в основном, способ заставить Javascript останавливаться, когда я отправляю запрос в Ruby, не продолжая работу, пока я не получу необходимые данные, и устранить возможные ошибки, которые могут всплыть.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 25 августа 2011

Я провел много времени с классом WebDialog.Я планировал написать такой насос, но обнаружил, что могу сделать это по-другому с более надежными результатами.

(Мои выводы WebDialog: http://forums.sketchucation.com/viewtopic.php?f=180&t=23445)


АльтернативаМетод

SketchUp> JavaScript

Мой альтернативный метод состоял в том, что я не пытался перенести данные из WebDialog в Ruby.Но вместо этого Руби накачал WebDialog, потому что Webdialog.execute_script является синхронным.

Я посылаю команду в WebDialog с запросом.Затем Javascript обрабатывает это и помещает результат в скрытый элемент INPUT, который я затем использую «WebDialog.get_element_value» для извлечения содержимого.

Все это я обернул в метод-обертку, чтобы обработать возвращаемый результат.значение и преобразовать его в соответствующие объекты Ruby.http://www.thomthom.net/software/sketchup/tt_lib2/doc/TT/GUI/Window.html#call_script-instance_method

Схема:

  1. Выполнение вызова (.execute_script) для очистки скрытого элемента INPUT
  2. Выполнение фактического вызова, который JS будет обрабатывать ипоместите возвращаемое значение в скрытый INPUT
  3. . Используйте .get_element_value для извлечения скрытого значения INPUT

Все это синхронно.


Насос JavaScript

Javascript> SketchUp

Если вам действительно нужно выкачивать информацию из JS, то я думаю, что вам нужно сделать что-то вроде этого:

  • JS: вставить сообщения в сообщениеочередь
  • JS: отправить сообщение SU о наличии сообщений
  • SU: когда обратный вызов уведомляет о новых сообщениях, запросите JS о следующем сообщении и продолжайте, пока не останется больше сообщений.Это должно работать, как если бы это был метод, описанный ранее.

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

(непроверенная теория.)

...