我有一个游戏,其中两个人互相对抗。时钟运行后,我调用下面的函数,这应该将当前问题增加1.然而,它增加1 TWICE。
increaseQuestion: function() {
GameCollection.update({current:true}, { $inc: { currentQuestion: 1}});
},
以下是调用它的代码:
Template.gamePage.clock = function () {
var game = GameCollection.findOne({current: true});
var currentQuestion = game.currentQuestion;
var question = game.gameQuestions[currentQuestion];
var clockQuestion = Clocks.findOne({gameId: game._id, questionId: question._id});
var clock = clockQuestion.clock;
if(clock === 0) {
Meteor.call('increaseQuestion');
} else {
Meteor.call('windDown', clockQuestion, clock);
}
// format into M:SS
var min = Math.floor(clock / 60);
var sec = clock % 60;
return min + ':' + (sec < 10 ? ('0' + sec) : sec);
};
以上是上述代码中的方法(可能会导致问题)
Meteor.methods({
windDown: function(clockQuestion, clock) {
var interval = Meteor.setInterval(function () {
clock -= 1;
Clocks.update(clockQuestion._id, {$set: {clock: clock}});
// end of game
if (clock === 0) {
// stop the clock
Meteor.clearInterval(interval);
// declare zero or more winners
}
}, 1000);
}
});
为什么函数被调用两次?我尝试将方法从客户端和服务器文件夹移动到仅服务器文件夹,它仍然被调用两次。
答案 0 :(得分:0)
我很惊讶它只被叫了两次,说实话。
clock
帮助器依赖于ClockQuestion
文档,该文档与当前游戏具有相同的gameId
。但是,当运行该帮助程序时,将调用windDown
方法,该方法将更新ClockQuestion
文档,这将导致帮助程序被动地重新运行,这将调用{ {1}}方法再次等...
老实说,出于这个原因,这种控制逻辑实际上不应该包含在辅助函数中 - 它将无法控制。 windDown
需要通过首先使windDown
模板呈现的任何内容来调用,或者gamePage
块,其反应性可以让您拥有更多的控制权,而不是反应性UI元素(由设计)由Meteor而不是您自己的应用程序明确管理。
答案 1 :(得分:-1)
我怀疑是这样的:Template.gamePage.clock
使用GameCollection
,所以当更新该集合时,该函数将被重新运行。
由于increaseQuestion
不依赖于客户端的任何参数,为什么不将它移动到// end of game
中的windDown
if块?