当先前函数完成时运行函数

我有下面两个函数,我需要按顺序执行它们,只有在第一个函数完成后才运行第二个函数。但是,这并没有发生,只输出第二个函数。

在原始 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

有什么想法吗?先感谢了!

点赞
用户4567755
用户4567755

-- test.lua

```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) -- 如果第二个定时器已经注册,启动它 end else a = a + 1 end print(a) end) tmr.start(1) -- 启动第一个定时器 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() -- 注册并启动第一个定时器 decrease() -- 注册第二个定时器 end

start() -- 开始

-- 可能的解决方案:

-- 1.在由第一个定时器调用的函数中调用 decrease。 -- 2.使代码更清晰,使用函数参数将回调传递给 increase(然后执行与第一点相同的操作)(如果传递给函数参数的内容发生更改,则可能需要将其移动到全局范围,作为某种临时变量;这是由nodemcu本身的性质决定的)。 -- 3.将 decrease 定时器注册为第二个定时器,并在 increase 的回调中启动它。 -- 4.将其拆分为注册,启动和回调:首先使用两个不同的回调(一个用于减少,另一个用于增加)注册两个定时器,然后启动第一个定时器,从其回调内部开始,当完整循环完成时 - 启动第二个定时器,并注销第一个定时器(基本上是前一个点,但略微扩展)。 -- 5.创建第三个定时器,等待第一个定时器完成,以便启动第二个定时器。 -- 6.可能的其他解决方案,例如挂起 decrease 定时器并稍后恢复它。

还应考虑不要使用神奇的数字,例如使用 tmr.ALARM_SEMI。定时器还有类似OOP的模型,因此如果您更愿意使用它,则更容易进行操作。 有关此内容的更多信息,请参见 tmr文档

2017-05-24 18:50:29