2017-05-24 97 views
0

下面我有两个功能,我需要按顺序执行它们,只有当第一个完成的下次运行。但是,这不仅仅是输出第二个功能。运行功能

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

任何想法?提前致谢!

+0

当所有增加的作业完成时,您应该从'increase()'内部调用'decrease()'。 –

+0

这是一个好方法吗?如果有一段时间我只需要执行'increase()'会怎么样? – hugalves

回答

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

+0

嗨Green ..我运行你的回复,但它不工作.. – hugalves

+0

@hugalves有什么特别的错误吗?或只是增加循环的清洁运行?无论如何,问题可能是因为'回调函数是本地函数,并且节点倾向于在调用之间移除所有局部变量(请参阅第二点的第二条评论)。我将改变使用两个单独计时器的答案,但如果将回调移动到全局范围(或​​至少应该是),则此方法仍然有效。 – Green