2014-10-03 2 views
3

Я хочу сделать свою тестовую функцию ниже, распечатать сообщение «k is not nil», но мой код не работает. Он уже получил значение k с моего сервера, но он не проверяет строку, если k ~ = nil then. Ниже мой код. Спасибо за любой входящий совет.Ошибка при приеме данных с сервера

local function receiveData() 
    local l,e = client:receive() 
    if l~=nil then 
     print(l) 
     return l,e 
    else 
     timer.performWithDelay(100,receiveData) 
    end 
end 

function test() 
    k = receiveData() 
    if k ~=nil then 
     print("k isn't nil") 
    end 
end 

test() 
+0

Поблагодарили бы комментарий, если вы думаете, что ответ должен быть улучшен, чтобы получить голос, THX! – Schollii

ответ

1

Проблема в том, что если данные не получены при первой попытке, то k равно нулю, и тест возвращается. receiveData будет вызываться снова со 100 миллисекундными интервалами до тех пор, пока данные не будут получены, но возврат будет отброшен функцией performWithDelay, а затем возвращается test (см. Первое предложение этого ответа).

Решение состоит в том, чтобы установить обратный вызов, который receiveData может позвонить, когда данные в конечном итоге поступят. Обратный вызов может обрабатывать данные. Замените return l,e на onReceiveData(l,e) и попросите что-нибудь, что ждет вас в цикле while. Конечно, receiveData может сразу установить, что этот флаг просматривается тестом, но как только ваше приложение становится больше, полезно отделить прием от процесса.

function receiveData() 
... 
-- then: 

local data = nil 

function onReceiveData(l,e) 
    data = l 
    print('ready to process data', data, e) 
end 

funtion test() 
    receiveData() 
    while data == nil do sleep(100) end 
    print('data received and processed') 
end 

test() 

где sleep(100) является то, что вы можете придумать, так как не существует встроенная функция, которая делает это в Lua или даже Corona (хотя Corona имеет system.getTimer(), который возвращает мс с момента запуска приложения, чтобы вы могли иметь

function sleep(ms) 
    local start = system.getTimer() 
    while system.getTimer() - start < ms do 
    end 
end 

Я не слишком увлечен пустым циклом while, но в функции тестовой утилиты это нормально. Если вы используете библиотеку сокетов, у него есть функция сна - посмотрите Lua wiki для других опций).

0

Удовлетворены ли вы данные? Что ваша программа печатает в консоли?

Вы можете рассмотреть следующую модификацию

local function receiveData() 
    local l,e = client:receive() 
    if l~=nil then 
    print(l) 
    return l,e 
    else 
    timer.performWithDelay(100,function() l, e = receiveData() end) 
    end 
    return l, e 
end 

Так я думаю, что когда receiveData вызывается второй раз, ваши возвращаемые значения (л, е) отбрасываются (потому что performWithDelay ничего не делать с ними).

+0

Привет vetham, я уверен, что данные были получены, потому что они печатают значение, которое я отправил правильно, но не знаю, почему он не печатает в функции test(). – jade

+0

Вы пробовали мои модификации? – vetham

+0

@jade (я не уверен, как работают уведомления) – vetham

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