2011-04-12 76 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