2011-04-12 52 views
0

我正在研究使用Ruby API编写的Google Sketchup插件。在这个API中有一个WebDialog class,可以用它来渲染HTML并在插件代码的WebDialog和Ruby端之间移动数据。我正在使用这个类为我的插件构建一个UI。Google Sketchup插件的Javascript事件循环/消息泵

异步地将数据从WebDialog发送到Ruby端。由于欠佳的文档,我最初并没有意识到这一点,现在我已经进入了我的插件,它开始给我造成一些问题。具体来说:当从WebDialog到Ruby端进行多次连续调用时,只有最后一次调用被执行。所以,我显然需要设计一些“桥梁”来防止WebDialog到Ruby端的调用丢失 - 我认为这基本上是一个“事件循环”或“消息泵”系统。

我的问题是,我不知道如何做到这一点。我所希望的是,某人可以为我提供某种资源,为我们提供一个框架,说明这样一个系统应该如何工作 - 需要什么样的检查,他们的执行顺序等等。我知道这可能是一个非常复杂的任务,但我只需要一些基本的东西:基本上,当我向Ruby发送请求时,停止Javascript的一种方式,直到获取我需要的数据并继续处理任何可能的错误出现。

任何帮助将非常感谢!

回答

1

我花了很多时间用WebDialog类。我计划写这样一个泵,但是我发现我可以用更可靠的结果做不同的事情。

(我WebDialog发现:http://forums.sketchucation.com/viewtopic.php?f=180&t=23445


替代方法

的SketchUp>的JavaScript

我的另一种方法是,我没有尝试从WebDialog到Ruby推送数据。但是相反,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)以清除隐藏的输入元素
  2. 使实际调用,它JS会处理,并把返回值放入隐藏的输入
  3. 使用.get_element_value获取隐藏的INPUT值

所有这些都是同步的。


的Javascript泵

的Javascript>的SketchUp

如果你真的需要从JS泵的信息,那么我认为你需要做这样的事情:

  • JS:推消息到消息队列
  • JS:发送消息给SU,有消息
  • SU:当回调通知新消息时,为下一条消息查询JS并继续,直到没有更多消息。这应该与之前描述的方法类似。

这个概念将存储您的消息,然后将控制权移交给SketchUp端,以便同步输送。

(未经测试的理论)

+0

JavaScript泵后来在SKUI中实现:https://github.com/thomthom/SKUI – thomthom 2014-04-22 14:00:39