我正在尝试从AngularJS(使用Firebase)的UI-Router解析中获取数组。
该数组包含来自不同俱乐部的会员费。俱乐部的费用在不同的时间发生变化,因此需要将特定时间点的正确费用推到数组中。
俱乐部在for循环中进行迭代。
对于每个俱乐部:
首先(异步)获取每个俱乐部的时间范围。每个时间范围都是一个对象,该对象显示需要支付特定费用的时间(date_active和date_ends)。时间范围实质上是包含费用的数据库其他部分的索引。
然后在时间范围内(同步)找到当前日期的正确时间范围。
然后使用正确的时间范围来获取该特定俱乐部在特定时间(异步)的费用。
我不确定如何在resolve函数中构造我的诺言,以确保可以在加载状态之前创建并返回费用数组。
我故意将所有$ q诺言处理都保留在代码中,因此,比我更了解的人会更容易插入它!是双异步调用让我发疯。
非常感谢!
.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;
}
答案 0 :(得分:0)
您可以将$ 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)
})