2011-12-27 322 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