流星个人用户计时器 - setInterval()

时间:2014-01-24 19:03:33

标签: meteor

我正在使用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,但我需要一个解决我问题的方法。如何为每个用户单独设置计时器?

1 个答案:

答案 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}}。将一个单独的地图保留在集合之外是没有意义的。