2016-07-26 2 views
0

유성 서버에서 무기한으로 실행되는 20 초 타이머가 있습니다. 사용자의 클라이언트가 연결되면 서버의 Timer 메소드에서 응답을받을 수있는 방법이 있습니까? 기본적으로 내가 달성하려고하는 것은 클라이언트에서 실행중인 동일한 타이머를보기 위해 연결하는 모든 사용자를위한 기능입니다.클라이언트가 페이지를로드 할 때 서버 메소드로부터 응답 받기 - 유성

그래서 짧게 ... 나는 클라이언트가 서버에서 계속 실행중인 메소드의 출력을 얻고 클라이언트에 응답을 출력하길 원합니다. 이것이 가능한가?

여기는 서버에서 실행중인 타이머 코드입니다.

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

    } 
}); 

답변

2

예 확실히 가능하고, 유성-방법은 작업을 수행 할 몽고/DDP/minimongo 관계를 사용하는 것입니다.

다른 말로하면 출력을 콜렉션에 쓰고 클라이언트에 공개하면 Meteor는 클라이언트가 항상 최신 출력을 사용할 수 있도록합니다.

그래서 내가 실수하지 않는다면이 코드를 클라이언트에 출력하고 싶다고 생각합니까? (autopublish 또는 사용)

Timestamp = new Mongo.Collection('timestamp')

를 게시 :

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

컬렉션을 만들기

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

삽입/온 문서를 (당신이 하나 필요) 업데이트 서버 :

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

그리고 클라이언트에서 읽으십시오.

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

51ms마다 문서를 업데이트하는 것에 대해 잘 모르는 중 ... – ghybs

관련 문제