我正在尝试从AngularJS (使用Firebase)中的UI路由器解析中获取数组。
该数组包含来自不同俱乐部的会员费。俱乐部费用在不同的时间变化,因此需要将特定时间点的正确费用推送到数组中。
在for循环中循环遍历clubs。
对于每个俱乐部:
首先(异步地)获取每个俱乐部的时间范围。每个time range都是一个显示特定费用(date_active和date_ends)的时间的对象。时间范围本质上是包含费用的数据库的其他部分的索引。
然后在时间范围内(同步)找到当前日期的正确时间范围。
然后,使用正确的时间范围来获得该特定时间内该特定俱乐部的费用(异步)。
我不确定如何在resolve函数中构造我的承诺,以确保在加载状态之前可以创建和返回费用数组。
我故意在代码中忽略了所有的$q promise处理,这样比我更了解的人插入起来会更容易!是两次异步呼叫让我抓狂。
非常感谢!
.state('whatever')
resolve: {
'clubsResolve' : clubsResolve //Assume clubs have been loaded
'feeResolve': feeResolve
}
function feeResolve(clubs){
var allFees = [];
for(var i=0; i < clubs.length; i++){
(function(i){
var club = clubs[i];
var timeRanges = $firebaseArray(db.child.('timeRanges').child(club.name));
timeRanges.$loaded().then(function(){
//I have omitted the details of this function
var correctTimeRange = getCorrectTimeRange(timeRanges, new Date())
var fee = $firebaseObject(db.child(club.name).child(correctTimeRange.date_active));
fee.$loaded().then(function(){
allFees.push(fee);
})
})
})(i);
}
return allFees;
}
发布于 2018-07-04 13:37:04
您可以将$q服务与递归函数结合使用,并在获得所有提要数据后对其进行解析。
.state('whatever')
resolve: {
'clubsResolve' : clubsResolve //Assume clubs have been loaded
'feeResolve': feeResolve
}
function feeResolve(clubs) {
return $q((resolve, reject), function () {
var allFees = [];
function getClubFees(clubs) {
var club = clubs[1];
var timeRanges = $firebaseArray(db.child.('timeRanges').child(club.name));
timeRanges.$loaded().then(
function (timeRange) {
var fee = $firebaseObject(db.child(club.name).child(timeRange.date_active));
fee.$loaded().then(
function (fee) {
allFees.push(fee);
clubs.shift()
if (clubs.length) {
getClubFees(clubs)
}
else {
resolve(allFees)
}
},
function (error) {
reject('failed to get fee for ' + club + timeRange);
})
},
function (error) {
reject('failed to get fee for ' + club.name);
})
}
getClubFees(clubs)
})
https://stackoverflow.com/questions/51173466
复制