2015-04-23 69 views
1

我遇到了Lua函數的問題。我可以將sendAction的返回值設置爲一個字符串(「test」),並且它將正確返回。但是我無法得到「數據」的變量返回,因爲它總是返回nil。我究竟做錯了什麼?lua函數不返回數據

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; 

回答

3

sendAction不包含return語句(在其範圍內)。你爲什麼會期望它返回什麼?

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 
+0

此代碼仍然返回零,我知道有一個正確的響應,因爲我可以打印原始響應,並從服務器得到預期的JSON。 – user3342210

+0

更新:我改變了這部分:onSendActionComplete(true,data);到onSendActionComplete(true,json.decode(event.response));這似乎是有原因的,我假設是因爲數據的範圍? (更新:是的,這是數據的範圍,我將var移動到事件監聽器的主要區塊,現在可以工作。非常感謝@Mud – user3342210