在Meteor上,当我试图只调用一次时,一个带有$ inc:的函数被调用两次

时间:2014-07-30 20:12:48

标签: javascript mongodb meteor

我有一个游戏,其中两个人互相对抗。时钟运行后,我调用下面的函数,这应该将当前问题增加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);
    }
});

为什么函数被调用两次?我尝试将方法从客户端和服务器文件夹移动到仅服务器文件夹,它仍然被调用两次。

2 个答案:

答案 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块?