流星方法回调循环,我做错了什么?

时间:2013-12-12 02:20:53

标签: javascript asynchronous callback meteor

我已经看了一段时间,我很确定它与无限回调循环有关。

我有一个方法,它从名为Sessions的集合中返回一个整数。以下是我的方法:

Meteor.methods({

      going: function(sessionsId) {
        return Sessions.update(sessionsId, {$addToSet: {participants: Meteor.userId()}, $inc: {slots:-1}});  
      },

      retract: function(sessionsId) {
        return Sessions.update(sessionsId, {$pull: {participants: Meteor.userId()}, $inc: {slots:1}});  
      },

      sessionFull: function(sessionsId) {
        var session = Sessions.findOne({_id:sessionsId});
        console.log("gets here");
        return session.slots;
      }
    });

然后在我的客户中我有:

if (Meteor.isClient) {
      Template.hello.sessions = function () {
        return Sessions.find();
      };

      Template.session.this_info = function () {
        return this._id;
      };  

      Template.session.isGoing = function() {
        var session = Sessions.find({_id:this._id, participants:Meteor.userId()}).count();
        if (session > 0) return true;
        else return false;
      };

      Template.session.sessionFull = function() {
        if (this.slots === 0) return true;
        else return false;
      };

      Template.session.slotsMethod = function () {
        Meteor.call('sessionFull',this._id, function(error, slots) {
          Session.set("slots",slots);
        });
        return Session.get("slots");
      };

      Template.session.events({
        'click input.going' : function () {
         //Sessions.update(this._id, {$inc: {slots: -1}}); 
         Meteor.call('going', this._id, function(error, updated) {
           if (error)
             return alert(error.reason);
         });
        },

        'click input.retract' : function () {
          Meteor.call('retract', this._id, function(error, removed) {
            if (error)
              return alert(error.reason);
          });
        }
      });

所以我基本上有几个按钮可以增加或减少插槽字段,我希望有一个方法可以返回插槽字段包含的内容。这是我的模板:

      {{#each sessions}}
        {{> session}}
      {{/each}}

    <template name="session">
    <br>
    {{date_time}}, {{duration}}
    {{#if isGoing}}
      <input type="button" class="retract" value="not going/give slot" />
    {{else}}
      {{#if sessionFull}}
        <h1>SORRY SESSION FULL</h1>
      {{else}} 
        <input type="button" class="going" value="going/subract slot" />
      {{/if}}
    {{/if}}
    {{participants}},{{sessionFull}},{{this_info}}
    </template>

如果我尝试将Template.session.slotsMethod添加到我的模板(调用sessionFull Meteor方法),我会得到一个无限循环,因为它会为每个会话显示一个快速变化的整数。

我做错了什么?无法弄清楚,我认为它与回调/异步/同步有关但不确定。

1 个答案:

答案 0 :(得分:1)

是的,您的Template.session.slotsMethod会导致无限循环,因为Session是被动的。

这就是:

  • 每当Session.get(“slots”)发生变化时,Template.session.slotsMethod将被调用,因为它依赖于Session.get("slots")
  • 但是,Template.session.slotsMethod本身也在更新Session.get("slots")的值,因此该过程将重新开始。

不太确定何时需要运行Template.session.slotsMethod,但您可能希望将其分解为两部分,例如:

Template.session.getSlots = function () {
  return Session.get("slots");
};

Meteor.call('sessionFull',this._id, function(error, slots) {
  Session.set("slots",slots);
});

需要随时随地进行sessionFull检查,可能在Template.session.rendered