我似乎在尝试从成功回调函数中设置的参数存在问题:
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并从外部调用它,假设初始化函数?
答案 0 :(得分:1)
这不是闭包的问题(意味着您的变量无法从您的回调函数或类似的东西中访问),这是执行时序的问题。当客户端从服务器获取响应时,您的success
回调将以异步执行。确保响应已到达的唯一方法是使用侦听器(http://backbonejs.org/#Events)或回调(作为您的成功函数)。如果您确保在收到回复后 后执行了部分代码,那么您的active
参数值就会合适。
当你这样做时:
console.log(this.get('active'));
请求仍处于待处理状态,因此active
仍然等于-1
。所以你的问题仍然是你没有考虑代码的异步方面。
答案 1 :(得分: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();
}
});
}
P.S。感谢@Loamhoof挑战我以前的假设并提供一个例子。