【问题标题】:Javascript event loop/message pump for Google Sketchup plugin用于 Google Sketchup 插件的 Javascript 事件循环/消息泵
【发布时间】:2011-08-25 20:44:53
【问题描述】:

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

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript ruby sketchup


    【解决方案1】:

    我在 WebDialog 类上花了很多时间。我打算写这样一个泵,但我发现我可以用不同的方法来做,结果更可靠。

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


    替代方法

    SketchUp > JavaScript

    我的替代方法是我没有尝试将数据从 WebDialog 推送到 Ruby。但是因为 Webdialog.execute_script 是同步的,所以让 Ruby 抽出 WebDialog。

    我通过查询向 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 端,后者可以同步泵送它。

    (未经检验的理论。)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多