2014-01-24 4 views
0

Я создаю онлайн-систему викторин с использованием Meteor. Ожидается, что у каждого использования в викторине будет установлен собственный таймер на один час. Таймер должен начинаться с первого входа пользователя. В настоящее время я поддерживаю коллекцию под названием UserClocks (userId, timeLeft).Индивидуальные таймеры Meteor - setInterval()

Я написал 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() находится внутри метода, который называется Ь пользователем. Я продолжаю получать timeLeft как NaN, поскольку userClock не определен. Я думаю, я понимаю, почему я не могу использовать this.userId внутри setInterval(), но мне нужно решение моей проблемы. Как настроить таймер отдельно для каждого пользователя?

+0

Я также попробовал userId из параметров метода в .find(). Он по-прежнему возвращает undefined для timeLeft! – Pawan

+0

Что делать, если пользователь входит в консоль, 'UserClocks.update (userClock._id, {timeLeft: 999999})'? –

+0

Я пробовал, но не определился. Однако UserClocks.find ({_ id: "o8y5nw4Wp5H7SF8bP") вернул LocalCollection.Cursor. Я использую небезопасный пакет и поместил свои UserClocks в мою общую коллекцию model.js. – Pawan

ответ

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(). Не имеет смысла хранить отдельную карту за пределами коллекции.

+0

Я пробовал то, что вы предложили. userId отлично работает снаружи и внутри setInterval(). Я также пробовал его, передавая его как параметр методу. Этот setInterval уже находится внутри метода, который находится внутри блока Meteor.methods. Попробуйте то, что вы предложили, я все еще получаю timeLeft и clockId как undefined. – Pawan

+0

Выход: CLock id: 5EZgsavncGBBXr8Qj I20140125-02: 10: 03.546 (5.5)? Идентификатор пользователя: JFPfgyeordrME6m4M I20140125-02: 10: 03.547 (5.5)? Поиск часов для: 5EZgsavncGBBXr8Qj I20140125-02: 10: 03.547 (5.5)? Найдено clockundefined I20140125-02: 10: 03.547 (5.5)? Найдено часы: undefined I20140125-02: 10: 03.553 (5.5)? Обновлен UserClock. timeleft: NaN I20140125-02: 10: 04.551 (5.5)? Идентификатор пользователя: JFPfgyeordrME6m4M – Pawan

Смежные вопросы