我正在开发一个小应用程序,其中我们基本上有组、子组和子组的成员。这种情况下的组是风险区域,数量基本上是3个。给定的ID分别为1、2和3。每个风险区域都有称为家庭单元的子组,每个家庭单元都有家庭成员。一个风险区可能有大约127个家庭单元,每个家庭单元都有各自的成员。
我面临着检索每个家庭单元下分组的家庭成员的挑战。我得到了结果,但大多数都是未定义的。在一个风险区域有127个家庭单元的情况下,我只能检索到大约24个家庭单元及其超过100个未定义的成员。下面是我的控制器
我的控制器
.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。
我的服务
(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个家庭单元及其成员被检索到,其余的未定义。
发布于 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。如果任何承诺被拒绝,则此生成的承诺将被拒绝,并具有相同的拒绝值。
$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
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 promises,promise angular $q.all,和一个工作的代码片段。
'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]) ;
<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>
https://stackoverflow.com/questions/53036440
复制相似问题