我有以下代码:
var favourites = JSON.parse(localStorage.getItem("favourites"));
Service.all().then(function (multiple) {
var array = [];
for (var i = 0; i < multiple.length; i++) {
for (var j = 0; j < favourites.length; j++) {
if (favourites[j].checked === true) {
if (multiple[i].Name === favourites[j].name) {
Service.getAllBySomething(multiple[i].Id).then(function (resources) {
var arrayOfSomething = [];
for (var k = 0; k < resources.length; k++) {
arrayOfSomething.push(resources[k].ResourceCategoryId);
}
arrayOfSomething = arrayOfSomething .filter(function (elem, pos, arr) {
return arr.indexOf(elem) == pos;
});
multiple[i].existingProperty= arrayOfSomething;
});
array.push(multiple[i]);
}
}
}
}
$scope.vendors = array;
});
我的问题是它每次都说“无法设置未定义的属性existingProperty”。而且我不知道为什么 multiple [i] 应该在这一行未定义:
multiple[i].existingProperty= arrayOfSomething;
我相信该物业存在。它被定义,它是一个空数组。这个空数组我想用循环中的make数组替换。 故障在哪里?如何用我的数组填充现有属性?
答案 0 :(得分:1)
Service.getAllBySomething
是否异步?因为在这种情况下,当回调函数运行时,i
(仅在闭包中捕获)已移动到数组的末尾。
在分派异步调用时使用额外的闭包来捕获i
的值,如下所示:
Service.getAllBySomething(multiple[i].Id).then(function(i){
return function (resources) {
var arrayOfSomething = [];
for (var k = 0; k < resources.length; k++) {
arrayOfSomething.push(resources[k].ResourceCategoryId);
}
arrayOfSomething = arrayOfSomething .filter(function (elem, pos, arr) {
return arr.indexOf(elem) == pos;
});
multiple[i].existingProperty= arrayOfSomething;
};
}() );
注意接收i
作为参数的新函数并返回您之前使用的函数。我立即调用(IIFE)来返回要作为回调传递的函数。在该函数内部,i的值将与您调度此异步调用时的值相同,因为它在用作参数时被复制。