Lua函数没有返回数据。

我在使用 Lua 函数时遇到了问题。我可以将 sendAction 的返回值设置为字符串("test"),并且它会正确地返回。但是我不能够让变量"data"返回,因为它总是返回nil。我做错了什么?

local json = require(“json”);
local action = {};
local action_mt = {__ index = action}

--------- 私有函数 ------------

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(“网络错误!”);
        还有
            data,pos,msg = json.decode(event.response);
            if(data.errors.count> 0)then
                print(“错误”);
            二
        end
        return data;
    end

    network.request(“http://127.0.0.1/action.php”,“POST”,networkListener,params)
end

------公共函数------
function action:new(动作)
    local newAction = {action = action};
    return setmetatable(newAction,action_mt)
end

function action:createSession()
    local data = action:sendAction({action =“createSession”});
    print(数据);
end

返回行动;
点赞
用户501459
用户501459

sendAction在其作用域中不包含返回语句。你为什么会期望它返回任何东西?

调用network.request是异步的,这意味着请求实际上发生在一个并行于你的主要代码执行的单独线程中,因此对服务器的请求和响应将在sendAction返回后发生。

你想使用与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
2015-04-23 21:13:02