2016-04-25 10 views
0

Ich brauche setInterval zu verwenden, um Abfragen zur Datenbank jeweils N Sekunden und Feuer Ergebnisse aller Socket.IO Kunden zu tun, so dass ich es wie folgt tun:Ist es eine gute Idee, globale NodeJS-Ereignisse per Prozess zu verwenden?

let interval_id = null 

io.on('connection', function(socket) { 
    if (interval_id == null) { 

     interval_id = setInterval(function() { 
      db.table.items.getAll().then(function(items) { 
       process.emit('items_found', items) 
      }).catch(function(err) { 
       log.error(err) 
      }) 
     }, config.scan.interval) 
    } 

    process.on('alarms_found', function(alarms) { 
     console.log(alarms.length) 
    }) 
}) 

Es funktioniert gut, aber ich bin Neuling in NodeJS und I don‘ t kenne andere Möglichkeiten, dies zu tun ... Im Allgemeinen verstehe ich, dass die Verwendung von globalen Umfang nicht die beste Idee ist, aber ich weiß nicht, andere ...

+0

Es sieht so aus, als würden Sie die Datenbank für jede Verbindung abfragen. Dies ist wahrscheinlich keine gute Idee. Es wäre besser, die neue Verbindung irgendwo zu registrieren, die Datenbank einmal abzufragen und das Ergebnis an jede Verbindung zu senden. –

+0

@DanielDiekmeier mit Verbindung ist alles in Ordnung. Es gibt Singleton. Außerdem gibt es eine 'if'-Anweisung, die sicherstellt, dass die' setInterval'-Funktion nur einmal ausgeführt wird – Kiril

Antwort

1
  • Wenn Ihr echter Code ist gleich, oder In Bezug auf Umfang und Komplexität ist dieser Ansatz nicht problematisch. Prozessobjekt ist ein EventEmitter, und hier nutzen Sie es effektiv.
  • Wenn nicht, ist es eine gute Idee, einen eventitemitter statt Prozessobjekt zu verwenden. Vom Entwurf her stellt es wichtige Parameter des laufenden Knotenprozesses wie Ausführungsumgebung, Knotenmodule und andere Betriebssystemabstraktionen dar. Die EventEmitter-Vererbung unterstützt die Verwaltung der Prozesslebenszyklusereignisse.
  • Wenn Sie den Datenfluss der benutzerdefinierten Anwendung durcheinander bringen, treten keine funktionalen Probleme auf, aber wenn die Anwendung wächst, werden die Wartung und die Problembestimmung schwierig. Wenn Sie zum Beispiel die "Alarme" (entweder vollständig oder eine Teilmenge davon) in jedem Intervall speichern, wird das Speicherobjekt unbegrenzt wachsen und niemals Müll sammeln. ii) Auch nachdem Sie mit den DB-bezogenen Aktivitäten fertig sind, wird der Listener weiterhin aktiv sein, zusammen mit dem von ihm gehaltenen Speicher. Sie können das in diesem Szenario tatsächlich umgehen, indem Sie die Callback-Funktion (z. B. foo) benennen und den Callback entfernen, indem Sie process.removeListener ('alarms_found', foo) ausgeben, wenn dies nicht erforderlich ist.
Verwandte Themen