Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[NodeJS] Afvuren van alarm events

Pagina: 1
Acties:

  • gitaarwerk
  • Registratie: Augustus 2001
  • Niet online

gitaarwerk

Plays piano,…

Topicstarter
Hai. alweer een tijdje geleden dat ik met een vraagstuk zat :)..

Ik ben een home automatisering aan het bouwen met NodeJS services. (Ja, dit is meer backend, maar javascript is misschien weer ertussen 8)7 ).

Het eerste onderdeel is een alarm. Die kan ik aansturen met getters en setters en slaan deze verschillende alarmen op in mongoDB.

Nu kom ik terug bij een heel simpel iets misschien, maar mijn brein denkt wellicht iets te lastig (of ik ken NodeJS nog niet goed genoeg).

In mijn klok script het ik een setInterval die iedere 10 seconden een functie aanroept die mongoDB uitleest en kijkt welke alarmen er op dit moment in moeten worden geschakeld.

Mijn probleem is dat iedere 10 seconden (6 maal) dezelfde resultaten worden gegeven als het 12:00 het alarm wordt ingesteld (totdat het dus 12:01 is).

Eigenlijk zou het maar een keer moeten worden uitgevoerd.

Nu zijn er meerdere oplossingen, maar welke is het beste?

1) De interval verhogen naar 30 seconden. Misschien niet een optie, omdat wanneer ik een stopwatch zou willen aanroepen, ik ms nodig ga hebben. Deze kan ik aparte prototype/functie voor schrijven wellicht. Energieverbruik is wel weer beter met 30seconden :o

2) Een event maken en die een keer uitvoeren met event.EventEmitters. Per dag resetten. Nadeel: Meerdere alarmen op 1 dag wordt lastig dan.

3) Een lijst maken met alarmen die zijn afgegegaan.. en die niet meer opnieuw aanroepen. De lijst ook uitlezen of deze actief zijn skippen, anders uitvoeren, komen ze niet overeen, dan eruithalen.
Dit heeft mijn voorkeur; maar is dit wel efficient genoeg? Het voelt een beetje houtje touwtje aan. Op den duur wil ik ook snooze functionaliteit inbouwen, en nog mogelijkheid om per alarm een bericht naar een andere service te sturen dat iets van te voren moet in werking gesteld worden. (zoals wakeup light oid :) )

'K kan natuurlijk ook gewoon een bestaande node module pakken als bijvoorbeeld deze.. maar where is the fun in that :Y) .

Ik hoop dat ik het duidelijk uitleg :P

[ Voor 3% gewijzigd door gitaarwerk op 15-02-2014 12:45 ]

Ontwikkelaar van NPM library Gleamy


Verwijderd

Misschien zie ik hier iets over het hoofd maar wat dacht je van:
  1. De applicatie start en verkrijgt een lijst van de tijdstippen in volgorde van afgaan uit de database.
  2. Je haalt het eerste element uit de lijst en bepaald wanneer het alarm moet afgaan (setTimeout).
  3. Wanneer het alarm is afgegaan herhaal je stap twee.
De database elke tien seconden pollen is niet bepaald een elegante oplossing.

  • gitaarwerk
  • Registratie: Augustus 2001
  • Niet online

gitaarwerk

Plays piano,…

Topicstarter
Dat kan inderdaad mooi werken.

Ik zou wel de database nog willen pollen voor dan misschien nieuwe records. Maar dan per uur misschien, en bij een setter.

Dan zou ik ieder alarm in een nieuwe instance kunnen zetten en bepaalde prototyping op los kunnen laten. Iedere instance kan zichzelf dan aanroepen, alleen er moet ergens nog polling zijn voor alle instances. Dat kan heel mooi met een event emitter. bijvoorbeeld : event.emit('alarm');

Ontwikkelaar van NPM library Gleamy


Verwijderd

Los van dat ik je derde alinea niet versta is het netter om je applicatie te verwittigen dat de tijdstippen gewijzigd zijn in plaats van de database te pollen. Dan is het een kwestie van de huidige setTimeout te annuleren en te herbeginnen bij stap één (zonder de applicatie te herstarten uiteraard). Zo heb je in één klap ook ondersteuning voor het wijzigen en verwijderen van tijdstippen.

[ Voor 7% gewijzigd door Verwijderd op 15-02-2014 17:20 . Reden: Iets netter verwoord ]


  • gitaarwerk
  • Registratie: Augustus 2001
  • Niet online

gitaarwerk

Plays piano,…

Topicstarter
True :) Da's mooi. Ik moet het nog allemaal ene beetje bevatten. Nu is me het runtime en event georienteerd scripten me niet vreemd, maar blijft een lastig gegeven voor sommige simpele dingen. thanks :)

Edit: Even gekeken of het kan. setTimeout is op sich prima. Nadeel is dat het maar 32 bit values heeft. Dus als ik een timeout wil geven van iets in de verre toekomst, dan moet ik met intervals gaan werken. Denk dat ik een hybride oplossing moet gaan maken ervoor om nog enige precisie te behouden.

[ Voor 42% gewijzigd door gitaarwerk op 16-02-2014 10:24 ]

Ontwikkelaar van NPM library Gleamy