我正在創建一個Meteor應用程序,它有一些簡單的計時器。按下定時器上的開始或停止按鈕,每個調用一種方法來設置或清除間隔定時器等等。當我setInterval
時,我將結果對象存儲在當前的定時器文檔中,以便稍後當我想要清除間隔計時器時很容易找到。這是我遇到問題的地方。服務器端setInterval/clearInterval與流星
當運行Meteor.setInterval()
服務器端時,它返回一個對象。根據node.js文檔,這是正常的。如果我日誌創建後生成的對象,它返回:
{ _idleTimeout: 5000,
_idlePrev:
{ _idleNext: [Circular],
_idlePrev:
{ _idleTimeout: 5000,
_idlePrev: [Object],
_idleNext: [Circular],
_idleStart: 1393271941639,
_onTimeout: [Function],
_repeat: false },
msecs: 5000,
ontimeout: [Function: listOnTimeout] },
_idleNext:
{ _idleTimeout: 5000,
_idlePrev: [Circular],
_idleNext:
{ _idleTimeout: 5000,
_idlePrev: [Circular],
_idleNext: [Object],
_idleStart: 1393271941639,
_onTimeout: [Function],
_repeat: false },
_idleStart: 1393271941639,
_onTimeout: [Function],
_repeat: false },
_idleStart: 1393271943127,
_onTimeout: [Function: wrapper],
_repeat: true }
如果我從我的文檔檢索它後登錄的對象,我得到這個:
{ _idleTimeout: 5000,
_idlePrev: null,
_idleNext: null,
_idleStart: 1393271968144,
_repeat: true }
因此,使用clearInterval
與此不不行。這裏是我的服務器端代碼:
Meteor.methods({
play: function(entry){ //entry is the document
var currentPlayTimer = entry; //Global variable for the interval timer
Entries.update({_id: currentPlayTimer._id},{$set:{playing:true}}); //This is mostly to set the status of the play button for the client
var IntervalId = Meteor.setInterval(function(){Entries.update({_id: currentPlayTimer._id},{$inc:{time:1},$set:{intervalId: IntervalId}});},5000); //Increment by 1 every 5 seconds, put the object from the interval timer into the current document
console.log(IntervalId);
},
stop: function(entry){ //entry is the document
var currentPlayTimer = entry;
IntervalId = currentPlayTimer.intervalId;
console.log(IntervalId);
Meteor.clearInterval(IntervalId);
Entries.update({_id: currentPlayTimer._id},{$set:{playing:false, intervalId: null}});
}
});
而且,你會發現,在劇中方法,我設置intervalId
的setInterval
函數內。我在絕望中嘗試了這一點,並且工作。出於某種原因,如果我嘗試在創建間隔計時器Entries.update({_id: currentPlayTimer._id},{$set:{intervalId: IntervalId}})
後立即更新文檔,則會失敗。
所有這些工作都非常適合客戶端代碼,但我需要在服務器端完成此操作。我希望計時器能夠保持正確的速度,無論您的網頁是在5臺設備上打開還是不打開。
感謝您的幫助!這個項目是我第一次使用Meteor或Node上的任何東西,到目前爲止我非常喜歡它。
謝謝!這就說得通了。這是我爲此問題的任何其他人所做的: 創建一個數組以保存'setInterval'對象 'var intervalArray = [];' 將對象('IntervalId')推入數組中,存儲位置。這只是一個數字,所以我可以將它存儲在MongoDB文檔中。 'intervalArrayPosition = intervalArray.push(IntervalId) - 1;' 後來,讀的位置退了出來,並明確如下: 'Meteor.clearInterval(intervalArray [intervalArrayPosition]);' – dotbat
我想要做類似的事情,即使用戶關閉了瀏覽器,服務器上的「setInterval」也應該保持運行,直到他們登錄並停止它爲止 - 因此,與想要保存到數據庫相同的問題。註銷後'var intervalArray = []'如何保持? – evolross