2015-04-23 3 views
1

У меня возникли проблемы с функцией Lua. Я могу установить возвращаемое значение sendAction в строку («test»), и она вернется должным образом. Однако я не могу заставить переменную «данных» возвращаться, поскольку она всегда возвращает нуль. Что я делаю не так?Функция 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 не содержит оператора возврата (в его объеме). Зачем вам ожидать что-нибудь вернуть?

Вызов 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

Этот код по-прежнему возвращает nil, и я знаю, что есть правильный ответ, потому что я могу распечатать исходный ответ и получить json с сервера, как ожидалось. – user3342210

+0

Обновление: я изменил эту часть: onSendActionComplete (true, data); toSendActionComplete (true, json.decode (event.response)); По-видимому, это работает по какой-то причине, я предполагаю, что объем данных? (Обновление: Да, это была область данных, я переместил var в главный блок прослушивателя событий, и теперь он работает. Спасибо большое @Mud – user3342210

Смежные вопросы