Google Sketchup插件的Javascript事件循环/消息泵

时间:2011-04-12 00:26:35

标签: javascript ruby sketchup

我正在开发一个使用Ruby API编写的Google Sketchup插件。在这个API中有一个WebDialog class,可以用来呈现HTML并在插件代码的WebDialog和Ruby端之间移动数据。我正在使用这个类为我的插件构建一个UI。

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

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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)以清除隐藏的INPUT元素
  2. 进行JS将处理的实际调用,并将返回值放入隐藏的INPUT
  3. 使用.get_element_value获取隐藏的INPUT值
  4. 这一切都是同步的。


    Javascript泵

    Javascript>的SketchUp

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

    • JS:将消息推送到消息队列
    • JS:向SU发送消息
    • SU:当回调通知新消息时,查询JS以获取下一条消息并继续直到没有其他消息。这应该工作,因为它是如前所述的类似方法。

    概念是存储您的消息,然后将控制权移交给可以同步泵送的SketchUp端。

    (未经考验的理论。)