我有两个函数,我需要按顺序执行它们,只有当第一个完成下一次运行时才需要。但是,这不会仅仅输出第二个函数。
在原始Lua中,我们可以使用CALLBACK_MANAGER:FireCallbacks
和CALLBACK_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
有什么想法吗?提前谢谢!
答案 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。