2011-12-27 112 views
2

我需要對我的服務器進行異步HTTP調用才能接收XML響應。 當我得到響應後,如果它是成功或其他函數,如果它是一個錯誤,我會調用[之前指定的]函數。如何在Lua中使用回調進行異步HTTP調用?

所以我首先想到的是協同程序。不幸的是,在我進行http.get調用之後,我無法屈服,因爲它會等待整個事情完成。我知道我可以使用單獨的函數來讀取響應,但是我必須至少等待第一個字節的數據才能觸發這個函數,這可以讓我屈服。無論如何,因爲我想用協程來做的事情看起來並不像要走的路。

然後我試着從lua調用一個C函數,創建單獨的線程來獲取XML,然後在Lua中調用一個函數,但是這不起作用,因爲在創建新線程後lua_state發生了變化。在創建線程之前,我可以在堆棧中看到3個參數,並且在創建新線程後[我將lua_State作爲參數],它只有一個。無論如何,從我所瞭解的情況來看,lua_State將在原始cfunction調用完成後關閉,因此我將無法回撥。

因爲我剛開始使用lua,而且我對lua的c綁定還不太熟悉,所以我只能希望我犯了一些愚蠢的錯誤,並且很容易解決。然而,現在,我不知道如何進一步發展。

這個問題背後的故事: 我將我的遊戲從Cocos2D目標C框架移植到Cocos2d-X C++框架。我想使用Lua綁定,因爲我認爲我將無法將其移植到C++。無論如何,我想在Lua中做到這一點。 所以我有一個場景,有人訪問他們在遊戲中的庫存清單。如果迴應是即時的,他們基本上會看到一個打開的庫存清單窗口。但是,如果獲取數據需要稍微長一些(連接問題,服務器過載......任何情況)屏幕都會淡出,並且屏幕上會顯示一些指示數據傳輸的動畫。至少這是它在遊戲的objc版本上的工作方式,我想要的是同樣的東西。

在我的研究過程中,我是否有遺漏,是否有可能這樣做?

順便說一句我見過Lua socket asynchronous calls,它並沒有幫助我,因爲它仍然等待轉移的開始,然後纔會啓動另一個轉移。

回答

5

類似於Luvit

Luvit是試圖做一些事情,採取的NodeJS的真棒 架構和依賴關係,並看到它在Lua中 語言如何適應瘋了。

這個項目還在大力發展中,但它顯示了 的承諾。在最初與hello world服務器進行基準測試時,這是 比nodeJS快2到4倍。

+0

嗨,不幸的是我需要一些可以在iOS和Android上運行的東西。不幸的是,我不能使用luaJit來構建iOS應用程序:( – Krystian 2011-12-27 21:52:57