【问题标题】:Error in receiving data from server从服务器接收数据时出错
【发布时间】:2014-10-03 09:38:56
【问题描述】:

我想让下面的测试函数打印出消息“k is not nil”,但我的代码不起作用。它已经从我的服务器接收到 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()

【问题讨论】:

  • 如果您认为应该改进答案以获得投票,我们将不胜感激,谢谢!

标签: lua coronasdk


【解决方案1】:

问题是,如果第一次尝试没有收到数据,那么 k 为 nil 并且测试返回。 receiveData 将以 100 毫秒的间隔再次调用,直到接收到数据,但返回被 performWithDelay 丢弃,到那时 test 已返回(请参阅此答案的第一句)。

解决方案是设置一个回调,当数据最终到达时receiveData 可以调用。然后回调可以处理数据。用onReceiveData(l,e) 替换return 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(),它在应用程序启动后返回 ms,所以你可以有

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

我不太喜欢空的 while 循环,但在测试实用程序函数中它是可以的。如果您使用的是套接字库,它具有睡眠功能——请查看Lua wiki 了解其他选项)。

【讨论】:

    【解决方案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 对它们没有任何作用)。

    【讨论】:

    • 嗨 vetham,我确定数据已收到,因为它打印了我正确发送的值,但不知道为什么它没有在 test() 函数中打印。
    • 你试过我的修改了吗?
    • 嗨 vetham,我尝试通过让 k = client:receive() 在我的测试函数中编写新函数并且它可以工作。也不明白为什么上面的代码不起作用。
    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2012-08-17
    • 2015-06-09
    • 2019-06-02
    相关资源
    最近更新 更多