0

我试图从成功回调函数中设置的参数似乎有问题:

var CampModel = CampDataModel.extend({

    initialize : function(){

        this.fetchActiveAndPending();
        console.log(this.get('active'));
    },

    //Counts active and pending campaigns for front page.
    CountActiveAndPending : function(data){
      var active = 0;
      var pending = 0;

      $.each(data.returnValue,function(index,val){
        if (val.ApprovedOnSite){
          active++;
        }
        else
          pending++;       
      });
      this.set('active',active);
      this.set('pending',pending);
    },

    //fetches  data from server using campModel.
    fetchActiveAndPending : function(){
      console.log('fetching!');
      that = this;
     this.fetch({
        success:function(model,response){
          that.CountActiveAndPending(response);        
        }

      });
       }
    });

    return CampModel;
});

this.get('active') 的结果始终是默认数字。如果我尝试在成功回调函数中使用 this.get('active') ,它会给出正确的结果。是否可以从回调函数中设置一个 var 并从外部调用它,比如说初始化函数?

4

2 回答 2

1

这不是闭包的问题(这意味着您的变量无法从您的回调函数或类似的东西中访问),而是执行时间的问题。当客户端从服务器获得响应时,您的success回调将异步执行。确保响应已到达的唯一方法是使用侦听器(http://backbonejs.org/#Events)或回调(作为您的成功函数)。如果您确保在收到响应执行部分代码,您将获得正确的active参数值。

当你这样做时:

console.log(this.get('active'));

该请求仍处于未决状态,因此active仍等于-1。所以您的问题仍然是您没有考虑代码的异步方面。

于 2013-07-01T13:43:08.560 回答
1

我同意@Loamhoof,您有时间问题,一种解决方案是:

initialize : function(){
  this.fetchActiveAndPending(function() {
      console.log(this.get('active'));
  });
},

CountActiveAndPending : function(data){
  ...
},

fetchActiveAndPending : function(completeFn){
  console.log('fetching!');
  var _this = this;
  this.fetch({
    success:function(model,response){
      _this.CountActiveAndPending(response);
      completeFn();
    }

  });
}

ps 感谢@Loamhoof 挑战我之前的假设并提供了一个例子。

于 2013-07-01T14:23:04.633 回答