完成之前的运行功能

时间:2017-05-24 16:58:02

标签: lua esp8266 nodemcu

我有两个函数,我需要按顺序执行它们,只有当第一个完成下一次运行时才需要。但是,这不会仅仅输出第二个函数。

在原始Lua中,我们可以使用CALLBACK_MANAGER:FireCallbacksCALLBACK_MANAGER:RegisterCallback来处理此问题。我怎么能继续使用esp8266?

-- test.lua

function increase()
    a = 0
  tmr.alarm(1,1000,1,function()
    if (a == 10) then
      tmr.stop(1)
    else
      a = a + 1
    end
    print(a)
  end)
end

function decrease()
    a = 10
  tmr.alarm(1,1000,1,function()
    if (a == 0) then
      tmr.stop(1)
    else
      a = a - 1
    end
    print(a)
  end)
end

function start()
    increase()
    decrease()
end

start()

输出

➜ test git:(master) ✗ nu exec test.lua
➜ test git:(master) ✗ nu terminal
-- output
--- Miniterm on /dev/cu.wchusbserial1410  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
10
9
8
7
6
5
4
3
2
1

有什么想法吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

-- test.lua

function increase()
    a = 0
    tmr.register(1,1000,tmr.ALARM_SEMI,function()
       if (a == 10) then
         tmr.unregister(1)
         if tmr.state(2) ~= nil then
            tmr.start(2) -- starts second timer if registered
         end
       else
         a = a + 1
       end
       print(a)
    end)
    tmr.start(1) -- starts first timer
end

function decrease()
    b = 10
    tmr.alarm(2,1000,tmr.ALARM_SEMI,function()
       if (b == 0) then
         tmr.unregister(2)
       else
         b = b - 1
       end
       print(a)
    end)
end

function start()
    increase() -- register and start first timer
    decrease() -- register second timer
end

start()

可能的解决方案:

  • 从第一个计时器调用的函数内部调用decrease
  • 使它变得更清洁,并使用函数参数将回调传递给increase(然后执行与第一点相同的操作)(如果发生传递函数参数的事情,您可能希望将其移动到全局范围,如某种临时变量;这是由于nodemcu本身的性质。)
  • decrease计时器注册为第二个计时器并从increase的回调中启动它。
  • 将其拆分为注册,启动和回调:首先注册两个具有两个不同回调的定时器(一个用于递减,另一个用于递增),然后从第一个开始并从内部回调,当完整周期完成时 - 启动第二个定时器并取消注册第一个(基本上是前一点,但稍微扩展一点)。
  • 创建第三个计时器,等待第一个计时器完成以启动第二个计时器。
  • 可能还有其他解决方案,例如暂停decrease计时器并稍后恢复。

您还应该考虑不使用魔术数字并使用例如tmr.ALARM_SEMI。对于计时器也有类似OOP的模型,所以如果你更喜欢使用它,那么它就更容易实现。 有关它的更多信息,请on tmr's docs