首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeError:无法读取未定义的属性“”FuId“”

TypeError:无法读取未定义的属性“”FuId“”
EN

Stack Overflow用户
提问于 2018-10-29 05:55:39
回答 1查看 165关注 0票数 0

我正在开发一个小应用程序,其中我们基本上有组、子组和子组的成员。这种情况下的组是风险区域,数量基本上是3个。给定的ID分别为1、2和3。每个风险区域都有称为家庭单元的子组,每个家庭单元都有家庭成员。一个风险区可能有大约127个家庭单元,每个家庭单元都有各自的成员。

我面临着检索每个家庭单元下分组的家庭成员的挑战。我得到了结果,但大多数都是未定义的。在一个风险区域有127个家庭单元的情况下,我只能检索到大约24个家庭单元及其超过100个未定义的成员。下面是我的控制器

我的控制器

代码语言:javascript
运行
复制
    .controller('familyRiskCtrl', ['$scope', 'familydataService', '$routeParams', function ($scope, familydataService, $routeParams) {
        $scope.familysR = [];

        $scope.currentPage = 1;
        $scope.itemsPerPage = 5;

        getDataRiskArea();

        // Gets family by risk area
        function getDataRiskArea() {
            familydataService.getFamilysByRiskArea($routeParams.id).then(function (result) {
                $scope.familyR = result;
                console.log(result);

                // variable to hold the families
                var familyUnit = [];                     

                // Get family by FSU Id (FuId)
                angular.forEach(result, function (value, key) {

                    familydataService.getFamilyByFuId(value.FuId).then(function (resulti) {

                        var familyResult = resulti;
                        var FuIds = resulti[key].FuId;

                        console.log(key);

                        // Push the array object to families
                        familyUnit.push({
                            Id: value.FuId,
                            FamilyUnitName: value.FamilyUnitName,
                            Families: familyResult
                        })
                    });
                });

                // console.log(families);
                console.log(familyUnit);
                $scope.FamilyUnit = familyUnit;
            });
        }

        $scope.sortBy = function (column) {
            $scope.sortColumn = column;
            $scope.reverse = !$scope.reverse;
        };
    }])

下面是使用的服务。当我在控制台上记录结果时,我意识到风险区域获得了所有不同的家庭单元Ids,但在尝试获取不同家庭单元下的成员时,它只能检索到超过70%未提取的剩余数据的一些抛出错误。

请注意,当稍后用于获取家庭单元的成员时,我使用angular.forEach()的值来跟踪数组中不同的FuIds。

我的服务

代码语言:javascript
运行
复制
(function () {
'Use Strict'

angular
    .module('app')
    .factory('familydataService', ['$http', '$q', function ($http, $q) {
        var service = {};
        // Gets the Family by Risk Area ID
        service.getFamilysByRiskArea = function (id) {
            var deferred = $q.defer();
            $http.get('/Family/FamilyByRisk/' + id).then(function (result) {
                deferred.resolve(result.data);
            }, function () {
                deferred.reject();
            });
            return deferred.promise;
        };

        // Get family by FuID
        service.getFamilyByFuId = function (id) {
            var deferred = $q.defer();
            $http.get('/Family/FamilyByFuID/' + id).then(function (result) {
                deferred.resolve(result.data);
            }, function () {
                deferred.reject();
            });
            return deferred.promise;
        };

        return service;
    }]);
})();

下面是我的console.log的样子

从上面看,通过风险区域ID检索到127个家庭单元,其中24个家庭单元及其成员被检索到,其余的未定义。

EN

回答 1

Stack Overflow用户

发布于 2018-10-29 09:01:18

您正在尝试分析作为异步函数的嵌套promise中的值Id: value.FuId,

  • foreach循环将继续下一次调用,即使familydataService.getFamilyByFuId(value.FuId)尚未完成promise的
  • 返回方法具有自己的块作用域

由于这两个原因,代码将由于超出value变量的作用域而中断

在这里,您创建了一个包含127个结果的Http调用,然后为每个结果创建一个调用。这是总共128个获取对象的请求。关于所有可能的$routeParams.id请求的最大数据大小。我建议创建一个API调用,返回包含正确数据的DTO列表,使用表或||和视图上的索引,让时间开销在单个调用中到达服务器。

不过,如果您被认为是这样的话,可以试试$q.all。一个骗局是,它以的精确顺序解析,给了你相同的数组索引的优势,或者按照promise的名字,看API Reference的结尾。

返回单个promise,该promise将通过数组/值散列解析,每个值corresponding到promise数组/散列中相同索引/键处的promise。如果任何承诺被拒绝,则此生成的承诺将被拒绝,并具有相同的拒绝值。

代码语言:javascript
运行
复制
$q.all({ a: funa('load'), b: funb('load') }).then(function (r) {
    console.log(r, r.a, r.b);
})
$q.all([ funa('load'),funb('load') ]).then(function (r) {
    console.log(r, r[0], r[1]);
})

尝试使用第二个promise创建并调用一个函数,解析所需的var

代码语言:javascript
运行
复制
function getDataRiskArea(id) {
    familydataService.getFamilysByRiskArea(id).then(function (result) {
        $scope.familysR = result;
        let unique = result;
        // Get family by FSU Id (FuId)
        $scope.getFamily(unique);
    }).finally(function () {
        console.log($scope.FamilyUnit);
    });
}
function getFamily(RiskRes) {
    let loop = RiskRes;
    var promises = [];
    for (var i = 0; i < loop.length; i++) {
        let callid = loop[i]['FuId'];
        var promise = familydataService.getFamilyByFuId(callid);
        promises.push(promise);
    }
    //here is by indexing
    $q.all(promises).then(data => {
        //Here Data is an array of results by its call 
        //So the loop order has the same results here 
        console.log('All promises have resolved', data);
        let res = [];
        for (var i = 0; i < loop.length; i++) {
            let obj = {
                Id: loop[i]['FuId'],
                FamilyUnitName: loop[i]['FamilyUnitName'],
                Families: data[i]
            };
            res.push(obj);
        }
        $scope.FamilyUnit = res;
    });
}

这里有一些很好的参考,可以给出一个检查Chain multiple promisespromise angular $q.all,和一个工作的代码片段。

代码语言:javascript
运行
复制
'Use Strict';

function run($rootScope) {}
angular.module('app', [
]).controller('familyRiskCtrl', function ($scope, familydataService, $q) {
    $scope.familysR = [], $scope.tempUniqueIds = [];
    $scope.currentPage = 1;
    $scope.itemsPerPage = 5;
    // Gets family by risk area
    function getDataRiskArea(id) {
        familydataService.getFamilysByRiskArea(id).then(function (result) {
            $scope.familysR = result;
            let unique = result;
            // Get family by FSU Id (FuId)
            $scope.getFamily(unique);
        }).finally(function () {
            // this will be undefined to present you that this is async too 
            // and initiallized at the end  of getFamily
            console.log('FamilyUnit:',$scope.FamilyUnit);
        });
    }
    function getFamily(RiskRes) {
        let loop = RiskRes;
        var promises = [];
        for (var i = 0; i < loop.length; i++) {
            let callid = loop[i]['FuId'];
            var promise = familydataService.getFamilyByFuId(callid);
            promises.push(promise);
        }
        $q.all(promises).then(data => {
            //Here Data is an array of results by its call 
            //So the loop order has the same results order here 
            //That represents that data[i] is a result of loop[i]['FuId'] call
            //console.log('All promises have resolved', data);
            let res = [];
            for (var i = 0; i < loop.length; i++) {
                let obj = {
                    Id: loop[i]['FuId'],
                    FamilyUnitName: loop[i]['FamilyUnitName'],
                    Families: data[i]
                };
                res.push(obj);
            }
            $scope.FamilyUnit = res;
        });
    }

    $scope.getDataRiskArea = getDataRiskArea;
    $scope.getFamily = getFamily;

    $scope.sortBy = function (column) {
        $scope.sortColumn = column;
        $scope.reverse = !$scope.reverse;
    };
})
    .factory('familydataService', function ($http, $q, $timeout) {
        var service = {};
        var familyRiskAreaResult = [
            { FuId: 3, Area: 1, FamilyUnitName: 'Smiths' },
            { FuId: 1, Area: 1, FamilyUnitName: 'Jacksons' },
            { FuId: 4, Area: 1, FamilyUnitName: 'Monkey Jacksons' },
            { FuId: 2, Area: 1, FamilyUnitName: 'Stevens' },
            { FuId: 5, Area: 1, FamilyUnitName: 'Not unique also 3' }
        ];
        var familyUnit =
            [
                { Id: 1, FamilyUnitName: 'jks', Families: ['MJ', 'Janet', 'Latoia'] },
                { Id: 1, FamilyUnitName: 'jks', Families: ['Jacksons B1', 'Jacksons B2', 'Jacksons B3'] },
                { Id: 1, FamilyUnitName: 'jks', Families: ['Rebi', 'Dyana'] },
                { Id: 2, FamilyUnitName: 'Stvs', Families: ['Steven Seagal', 'Steven Tyler'] },
                { Id: 2, FamilyUnitName: 'Stvns', Families: ['King', 'Wonder'] },
                { Id: 3, FamilyUnitName: 'Smths', Families: ['MR', 'MRS'] }
            ];
        // Gets the Family by Risk Area ID
        service.getFamilysByRiskArea = function (id) {
            var deferred = $q.defer();
            //$timeout(function () {
                deferred.resolve(familyRiskAreaResult.filter(f => f.Area === id));
            //}, 1000);
            return deferred.promise;
        };

        // Get family by FuID
        service.getFamilyByFuId = function (id) {
            var deferred = $q.defer();
            //$timeout(function () {
            let res = familyUnit.filter(f => f.Id === id);
            let r = res.map(i => i.Families);
                deferred.resolve(r);
            //}, id * 1000);
            return deferred.promise;
        };
        return service;
    }).run(["$rootScope", run])    ;
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<body ng-app="app">
    <div ng-controller="familyRiskCtrl">
        <div>
            <div style="display:inline-flex;"ng-repeat="b in [1,2,3]">
                <button ng-click="getDataRiskArea(b)">
                    <strong>Call Area {{b}}</strong>
                </button>
            </div>
        </div>
        <div>
            <h4>Area Loaded $refid</h4>
            <ul>
                <li ng-repeat="fam in familysR">
                    FuId: <strong>{{fam.FuId}} - {{fam.FamilyUnitName}}</strong>
                </li>
            </ul>
         </div>
        <div>
            <h4>Results</h4>
            <div ng-repeat="fu in FamilyUnit">
                <h5>{{fu.Id}} - {{fu.FamilyUnitName}}</h5>
                <div>
                    <span ng-if="fu.Families.length === 0">---No Families---</span>
                    <ul ng-if="fu.Families.length >0">
                        <li ng-repeat="f in fu.Families">{{f}}</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</body>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53036440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档