lua 函数未返回数据
lua function not returning data
我在使用 Lua 函数时遇到问题。我可以将 sendAction 的 return 值设置为一个字符串 ("test"),它会正确地 return。但是我无法将 "data" 的变量设为 return,因为它总是 return 为零。我究竟做错了什么?
local json = require("json");
local action = {};
local action_mt = { __index = action }
---------PRIVATE FUNCTIONS------------
function action:sendAction(values, networkListener)
local data,pos,msg = "";
local params = {}; params.body = "";
for key,value in pairs(values) do
params.body = params.body .. "&" .. key .."=" .. value
end
local function networkListener( event )
if ( event.isError ) then
print( "Network error!" );
else
data,pos,msg = json.decode( event.response );
if (data.errors.count > 0) then
print("errors");
end
end
return data;
end
network.request( "http://127.0.0.1/action.php", "POST", networkListener, params )
end
------PUBLIC FUNCTIONS------
function action:new(action)
local newAction = { action = action };
return setmetatable( newAction, action_mt )
end
function action:createSession()
local data = action:sendAction( { action = "createSession" } );
print(data);
end
return action;
sendAction
不包含 return 语句(在其范围内)。你为什么 期望 它 return 什么?
对 network.request
的调用是 异步的 ,这意味着请求实际上发生在与主代码执行并行运行的单独执行线程中,因此请求服务器和来自服务器的响应将在 sendAction
编辑 return 之后发生。
您想使用与 network.request
相同的模型。也就是说,您将回调传递给 sendAction
,它会在结果可用时接收结果。这是异步代码的一种非常典型的模式。
function action:sendAction(values, onSendActionComplete)
local params = {}; params.body = "";
for key,value in pairs(values) do
params.body = params.body .. "&" .. key .."=" .. value
end
local function networkListener( event )
if event.isError then
onSendActionComplete(false, "Network error.");
else
local data,pos,msg = json.decode( event.response );
if data.errors.count > 0 then
onSendActionComplete(false, "JSON decode error.");
else
onSendActionComplete(true, data);
end
end
end
network.request( "http://127.0.0.1/action.php", "POST", networkListener, params )
end
------PUBLIC FUNCTIONS------
function action:new(action)
local newAction = { action = action };
return setmetatable( newAction, action_mt )
end
function action:createSession()
local function onSendActionComplete(success, data)
if success then
print(data);
else
print('Error:', data)
end
end
action:sendAction( { action = "createSession" }, onSendActionComplete)
end
我在使用 Lua 函数时遇到问题。我可以将 sendAction 的 return 值设置为一个字符串 ("test"),它会正确地 return。但是我无法将 "data" 的变量设为 return,因为它总是 return 为零。我究竟做错了什么?
local json = require("json");
local action = {};
local action_mt = { __index = action }
---------PRIVATE FUNCTIONS------------
function action:sendAction(values, networkListener)
local data,pos,msg = "";
local params = {}; params.body = "";
for key,value in pairs(values) do
params.body = params.body .. "&" .. key .."=" .. value
end
local function networkListener( event )
if ( event.isError ) then
print( "Network error!" );
else
data,pos,msg = json.decode( event.response );
if (data.errors.count > 0) then
print("errors");
end
end
return data;
end
network.request( "http://127.0.0.1/action.php", "POST", networkListener, params )
end
------PUBLIC FUNCTIONS------
function action:new(action)
local newAction = { action = action };
return setmetatable( newAction, action_mt )
end
function action:createSession()
local data = action:sendAction( { action = "createSession" } );
print(data);
end
return action;
sendAction
不包含 return 语句(在其范围内)。你为什么 期望 它 return 什么?
对 network.request
的调用是 异步的 ,这意味着请求实际上发生在与主代码执行并行运行的单独执行线程中,因此请求服务器和来自服务器的响应将在 sendAction
编辑 return 之后发生。
您想使用与 network.request
相同的模型。也就是说,您将回调传递给 sendAction
,它会在结果可用时接收结果。这是异步代码的一种非常典型的模式。
function action:sendAction(values, onSendActionComplete)
local params = {}; params.body = "";
for key,value in pairs(values) do
params.body = params.body .. "&" .. key .."=" .. value
end
local function networkListener( event )
if event.isError then
onSendActionComplete(false, "Network error.");
else
local data,pos,msg = json.decode( event.response );
if data.errors.count > 0 then
onSendActionComplete(false, "JSON decode error.");
else
onSendActionComplete(true, data);
end
end
end
network.request( "http://127.0.0.1/action.php", "POST", networkListener, params )
end
------PUBLIC FUNCTIONS------
function action:new(action)
local newAction = { action = action };
return setmetatable( newAction, action_mt )
end
function action:createSession()
local function onSendActionComplete(success, data)
if success then
print(data);
else
print('Error:', data)
end
end
action:sendAction( { action = "createSession" }, onSendActionComplete)
end