2017-05-24 100 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