我正在使用Meteor构建在线测验系统。测验中的每次使用都应该将他自己的计时器设置为一小时。计时器应该在用户首次登录时启动。 我目前正在维护一个名为UserClocks(userId,timeLeft)的集合。
我写了一个像这样的setInterval
var interval = Meteor.setInterval(function() {
console.log("User id: " + this.userId);
console.log("Searching clock for: " + clocksMap[this.userId]);
//clocksMap contains the _id of the UserClocks.
var userClock = UserClocks.find({_id: clocksMap[this.userId]});
if (!!userClock) {
console.log("Found clock: " + userClock.timeLeft);
} else {
console.log("Clock not found for user: " + this.userId);
}
var time = userClock.timeLeft;
time = time - 1;
UserClocks.update(userClock._id, {timeLeft: time});
console.log("Updated userClock. timeleft: " + time);
if (time === 0) {
//logout user and clear interval
Meteor.clearInterval(intervalMap[this.userId]);
}
}, 1000);
此setInterval()位于用户名为b的方法内。 我一直将timeLeft作为NaN,因为userClock未定义。 我想我明白为什么我不能在setInterval()中使用this.userId,但我需要一个解决我问题的方法。如何为每个用户单独设置计时器?
答案 0 :(得分:1)
将此代码放在Meteor.methods
块中。您可以在Meteor.userId()
功能中使用setInterval
,但不能在this.userId
内使用this
。在回调中,window
可能会设置为userId
,而Meteor.publish
没有userId
。
如果您在var userId = this.userId;
Meteor.setInterval(function() {
clock = UserClocks.find({_id: userId});
// Do stuff
}
回调中运行此内容,请事先存储UserClocks
:
_id
如上所述,我建议的另一件事就是将文档存储在userId
中,Meteor.userId()
或{{1}}对应{{1}}。将一个单独的地图保留在集合之外是没有意义的。