当前位置: 代码迷 >> JavaScript >> 无法设置未定义的属性“XY”
  详细解决方案

无法设置未定义的属性“XY”

热度:22   发布时间:2023-06-13 12:11:24.0

我有以下代码:

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”。 我不知道为什么在这一行应该定义多个[i]

multiple[i].existingProperty= arrayOfSomething;

我相信这个属性存在。 它被定义,它是一个空数组。 这个空数组我想用循环中的make数组替换。 故障在哪里? 如何用我的数组填充现有属性?

什么是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作为参数并返回先前使用的函数。 我正在调用(一个 )来返回作为回调传递的函数。 在该函数内部,i的值将与您调度此异步调用时的值相同,因为它在用作参数时被复制。

  相关解决方案