我正在开发一个使用Ruby API编写的Google Sketchup插件。在这个API中有一个WebDialog class,可以用来呈现HTML并在插件代码的WebDialog和Ruby端之间移动数据。我正在使用这个类为我的插件构建一个UI。
数据以异步方式从WebDialog发送到Ruby端。由于subpar文档我最初没有意识到这一点,现在我已经进入我的插件,它开始为我创造一些问题。具体来说:当从WebDialog到Ruby端进行多次连续调用时,只执行最后一次调用。所以,我显然需要设计某种“桥梁”,它将阻止从WebDialog到Ruby端的调用丢失 - 我认为,这基本上是一个“事件循环”或“消息泵”系统。
我的问题是我不知道如何做到这一点。我希望有人可以为我提供某种资源,为这样一个系统应该如何工作提供一个框架 - 需要什么样的检查,执行它们的顺序等等。我知道这可能是一个非常复杂的任务,但我只需要一些基本的东西:基本上,当我向Ruby发送请求时,一种使Javascript停止的方式,直到我得到我需要的数据,并处理任何可能的错误突然出现。
非常感谢任何帮助!
答案 0 :(得分:1)
我花了很多时间在WebDialog课上。我打算写一个这样的泵,但我发现我能以不同的方式做到更可靠的结果。
(我的WebDialog调查结果:http://forums.sketchucation.com/viewtopic.php?f=180&t=23445)
我的替代方法是我没有尝试将数据从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
大纲是:
这一切都是同步的。
如果你真的需要从JS中提取信息,那么我认为你需要做这样的事情:
概念是存储您的消息,然后将控制权移交给可以同步泵送的SketchUp端。
(未经考验的理论。)