Javascript 主干单击事件回调中的奇怪索引问题
我有这个代码,它是独立的和孤立的。我遇到的问题是,索引从1开始,而不是从0开始。我不知道为什么会出现这种情况,而且似乎与我正在向删除数组中推进的闭包无关……但我不能确定,不知道问题是什么Javascript 主干单击事件回调中的奇怪索引问题,javascript,backbone.js,Javascript,Backbone.js,我有这个代码,它是独立的和孤立的。我遇到的问题是,索引从1开始,而不是从0开始。我不知道为什么会出现这种情况,而且似乎与我正在向删除数组中推进的闭包无关……但我不能确定,不知道问题是什么 onClickResetAll: function (event) { event.preventDefault(); var deletes = []; Object.keys(
onClickResetAll: function (event) {
event.preventDefault();
var deletes = [];
Object.keys(collections).forEach(function (key) {
if (collections.hasOwnProperty(key)) {
var coll = collections[key];
for (var i = 0; i < coll.models.length; i++) {
deletes.push(function (callback) {
var index = i; //i starts at 1, not 0 !!!
coll.models[index].deleteModel(function (err, resp, x) {
console.log(err, resp, x);
if(err){
callback(err);
}
else{
callback(null,null);
}
});
});
}
}
});
async.parallel(deletes,function(err,results){
Backbone.Events.trigger('bootRouter', '+refreshCurrentPage');
});
}, //end of onClickResetAll callback function
//end
onClickResetAll:函数(事件){
event.preventDefault();
var=[];
Object.keys(集合).forEach(函数(键){
if(collections.hasOwnProperty(键)){
var coll=集合[键];
对于(变量i=0;i
问题并不在于i
从一开始,问题在于i
将coll.models.length
用于中删除的每个函数。为什么会这样?嗯,每个函数共享相同的i
,并且在实际调用deletes
中的函数之前,不会对i
进行求值
解决方案是在i
具有所需值时强制对其求值(即,在构建回调函数时求值i
)。有多种解决方案,它们都是“将其包装在函数中以打破引用”主题的变体:
使用带有回调函数的迭代器,而不是普通的for
循环:
coll.each(function(model, i) {
// `model` is the model from the collection, `i` is the loop index.
});
您可以在这里使用每个,因为主干
将环体包裹在SIF中:
for(var i = 0; i < coll.models.length; ++i)
(function(i) {
//...
})(i);
for(变量i=0;i
使用单独的函数来构建函数:
function make_deleter(coll, i) {
return function(callback) {
coll.models[i].deletedModel(function(err, resp, x) {
//...
}
}
}
//...
for(var i = 0; i < coll.models.length; ++i)
deletes.push(make_deleter(coll, i));
函数make_deleter(coll,i){
返回函数(回调){
coll.models[i].deletedModel(函数(err,resp,x){
//...
}
}
}
//...
对于(变量i=0;i
它们都做了几乎相同的事情:在混合中添加一个额外的函数调用,以强制i
在循环的每次迭代中进行求值(而不仅仅是引用)
在主干网的情况下,1可能是最自然的,你甚至不需要麻烦的
i
。另一个解决方案是使用async.each或async.eachSeries而不是async.parallel。使用前2个可以避免完全推到函数数组。ha!我希望如此var index=i;调用可以避免这个问题,但我想这还不够,因为i
在index=i
时仍然是i
,并且在调用函数之前不会发生这种情况。还要注意,特定索引处的模型会随着模型的删除而改变,因此coll.models[i]
不会总是你认为它是的模型。啊,你刚才的陈述准确地解释了为什么我当前的删除模型的方法不是删除/销毁所有模型,你有没有关于如何删除集合中的所有模型的建议,如果迭代这些模型会造成你刚才描述的问题?如果你使用coll、 每个(函数(模型){…})
那么您手中就有了模型
,因此不需要手动索引。明白了,谢谢您的勺子馈送:)非常感谢