2016-07-26 6 views
0

Ich habe einen 20-Sekunden-Timer, der unbegrenzt auf meinem Meteor-Server läuft. Wenn der Client eines Benutzers eine Verbindung herstellt, gibt es eine Möglichkeit, die Antwort von der Timer-Methode auf dem Server zu erhalten? Grundsätzlich versuche ich zu erreichen, dass alle Benutzer, die sich verbinden, den gleichen Timer auf ihrem Client sehen können.Erhalten Antwort von Server-Methode, wenn Client lädt Seite - Meteor

Also kurz ... Ich möchte ein Client die Ausgabe einer Methode, die kontinuierlich auf dem Server ausgeführt wird und dann die Antwort an den Client ausgeben. Ist das möglich?

Hier ist der Timer-Code, den ich auf dem Server laufen lasse.

Meteor.methods({ 

    runTimer: function() { 

    var running = false; 
    var seconds = 20000; // (1 sec = 1000) 
    var then; // Timer start time 

    // ------------------------------------ 
    // Evaluate and route 
    // ------------------------------------ 

    function router() { 
     if (!running) { 
     run(); 
     } 
    }; 

    // ------------------------------------ 
    // Run the timer 
    // ------------------------------------ 

    function run() { 
     running = true; 
     then = Date.now() + seconds; 
     var interval = setInterval(function(){ 
     var time = parseTime(then-Date.now()); 
     if (time[0] > 0) { 
      console.log(time[0] + '.' + time[1]); 
     } else { 
      console.log('0.00'); 
      running = false; 
      clearInterval(interval); 
      router(); 
     } 
     }, 51); 
    }; 

    // ------------------------------------ 
    // Parse time in MS for output 
    // ------------------------------------ 

    function parseTime(elapsed) { 
     // Array of time multiples [sec, decimal] 
     var d = [1000,10]; 
     var time = []; 
     var i = 0; 
     while (i < d.length) { 
      var t = Math.floor(elapsed/d[i]); 
      // Remove parsed time for next iteration 
      elapsed -= t*d[i]; 
      t = (i > 0 && t < 10) ? '0' + t : t; 
      time.push(t); 
      i++; 
     } 
     return time; 
    }; 

    router(); 

    } 
}); 

Antwort

2

Ja, es ist auf jeden Fall möglich, und die Meteor-Art und Weise ist die Mongo/DDP/minimongo Beziehung zu verwenden, es zu tun.

Mit anderen Worten, schreiben Sie die Ausgabe in eine Sammlung, veröffentlichen Sie diese auf den Clients, und Meteor stellt sicher, dass die neuesten Ausgaben immer für die Clients verfügbar sind.

Also in Ihrem Code, wenn ich mich nicht irre, denke ich, dass Sie diese Zeile an die Clients ausgeben möchten?

console.log(time[0] + '.' + time[1]);

Erstellen Sie eine Sammlung:

Timestamp = new Mongo.Collection('timestamp')

es veröffentlichen (oder benutzen Sie autopublish):

Meteor.publish("timestamp", function() { 
    return Timestamp.find(); 
} 

Einfügen/Aktualisieren Sie das Dokument (nur ein benötigen) auf der Server:

Timestamp.upsert({_id: 1}, {$set: {timestamp: time[0] + '.' + time[1]}}); 

Und auf dem Client, lesen Sie es.

Timestamp.findOne({_id: 1}); 
+0

Nicht sicher über die Aktualisierung Ihres Dokuments alle 51ms ist sehr nett ... – ghybs

Verwandte Themen