2017-05-24 4 views
0

Ich habe zwei Funktionen unten und ich muss sie in einer Sequenz ausführen, nur wenn der erste die nächsten Läufe beendet. Dies geschieht jedoch nicht nur durch die Ausgabe der zweiten Funktion.Run-Funktion, wenn vorherige abgeschlossen wurde

In roher Lua, können wir CALLBACK_MANAGER:FireCallbacks und CALLBACK_MANAGER:RegisterCallback verwenden, um dies zu behandeln. Wie könnte ich mit esp8266 fortfahren?

-- 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() 

OUTPUT

➜ 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 

Jede Idee? Danke im Voraus!

+0

Sie sollten 'abnahme()' von innen 'erhöhen()' aufrufen, wenn der ganze ansteigende Job fertig ist. –

+0

Ist das ein guter Ansatz? Was, wenn ich einige Zeit brauche, um nur 'erhöhen() 'auszuführen? – hugalves

Antwort

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() 

Mögliche Lösungen:

  • Aufruf decrease aus dem Inneren der Funktion von ersten Timer aufgerufen.
  • Machen Sie es ein wenig sauberer und Weitergabe von Callback an increase mit Funktionsparameter (und dann die gleiche Sache wie im ersten Punkt) (wenn etwas mit übergebenen Funktionsparameter passiert, möchten Sie vielleicht als eine Art von temporären globalen Bereich verschieben) Variable; es ist aufgrund der Natur von nodemcu selbst).
  • Registrierung decrease Timer als zweiter Timer und Starten von increase 's Callback.
  • Aufteilen in Registrierung, Start und Callbacks: zuerst zwei Timer mit zwei verschiedenen Callbacks registrieren (einen zum Abnehmen, einen zum Erhöhen), dann den ersten und von innen den Callback starten, wenn der volle Zyklus beendet ist - den zweiten Timer starten und die erste Registrierung aufheben (im Grunde vorheriger Punkt, aber ein wenig erweitert).
  • Erstellen eines dritten Timers, der darauf wartet, dass der erste Timer abgeschlossen wird, um den zweiten zu starten.
  • Möglicherweise andere Lösungen wie decrease Timer anhalten und später wieder aufnehmen.

Sie sollten auch in Betracht ziehen, keine magischen Zahlen zu verwenden und gehen Sie mit z. tmr.ALARM_SEMI. Es gibt auch ein OOP-ähnliches Modell für Timer, wenn Sie also mehr Lust darauf haben, es zu benutzen, ist es viel einfacher. Mehr darüber finden Sie unter on tmr's docs.

+0

Hallo Green .. Ich führe deine Antwort, aber es funktioniert nicht .. – hugalves

+0

@hugalves Irgendwelche bestimmten Fehler? Oder sauberen Lauf von nur zunehmender Schleife? Anyway Problem ist wahrscheinlich, weil "Callback" ist lokal zu funktionieren und Knoten hat die Tendenz, alle lokalen Variablen zwischen den Aufrufen zu entfernen (siehe zweiten Kommentar zum zweiten Punkt). Ich werde die Antwort ändern, um zwei separate Timer zu verwenden, aber diese Methode ist immer noch gültig, wenn Sie den Rückruf in den globalen Bereich verschieben (oder zumindest sollten). – Green

Verwandte Themen