从ui路由器解析中获取包含循环中两个异步调用的数组

时间:2018-07-04 12:14:30

标签: angularjs firebase angular-ui-router angularfire

我正在尝试从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;

}

1 个答案:

答案 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)
    })