Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mobile lua函数不返回数据_Mobile_Lua_Coronasdk - Fatal编程技术网

Mobile lua函数不返回数据

Mobile lua函数不返回数据,mobile,lua,coronasdk,Mobile,Lua,Coronasdk,我的Lua函数有问题。我可以将sendAction的返回值设置为字符串(“test”),它将正确返回。然而,我不能让“data”变量返回,因为它总是返回nil。我做错了什么 local json = require("json"); local action = {}; local action_mt = { __index = action } ---------PRIVATE FUNCTIONS------------ function action:sendAction(values,

我的Lua函数有问题。我可以将sendAction的返回值设置为字符串(“test”),它将正确返回。然而,我不能让“data”变量返回,因为它总是返回nil。我做错了什么

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
不包含返回语句(在其范围内)。你为什么期望它会返回任何东西

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

您想要使用相同型号的
网络。请求
不需要。也就是说,您将回调传递给
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

这段代码仍然返回nil,我知道有一个正确的响应,因为我可以打印原始响应并按预期从服务器获取json;到onSendActionComplete(true,json.decode(event.response));这似乎是出于某种原因,我假设是因为数据的范围?(更新:是的,这是数据的范围,我将var移动到事件侦听器的主块,现在它可以工作了。非常感谢@Mud