Nano Hash - криптовалюты, майнинг, программирование

Ошибка получения данных с сервера

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

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()
03.10.2014

  • Был бы признателен за комментарий, если вы считаете, что ответ следует улучшить, чтобы проголосовать, спасибо! 05.10.2014

Ответы:


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, чтобы узнать о других функциях. опции).

04.10.2014

2

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

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

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 вызывается во второй раз, ваши возвращаемые значения (l, e) отбрасываются (потому что PerformWithDelay ничего с ними не делает).

03.10.2014
  • Привет, vetham, я уверен, что данные были получены, потому что они печатают значение, которое я отправил правильно, но не знаю, почему оно не печатается в функции test(). 03.10.2014
  • Вы пробовали мои модификации? 03.10.2014
  • Привет, vetham, я попытался написать новую функцию в своей тестовой функции, разрешив k = client:receive(), и она работает. Также не понимаю, почему приведенный выше код не работает. 04.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..