首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从ui获取数组-在循环中包含两个异步调用的路由器解析

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

Stack Overflow用户
提问于 2018-07-04 20:14:30
回答 1查看 28关注 0票数 1

我正在尝试从AngularJS (使用Firebase)中的UI路由器解析中获取数组。

该数组包含来自不同俱乐部的会员费。俱乐部费用在不同的时间变化,因此需要将特定时间点的正确费用推送到数组中。

在for循环中循环遍历clubs。

对于每个俱乐部:

首先(异步地)获取每个俱乐部的时间范围。每个time range都是一个显示特定费用(date_active和date_ends)的时间的对象。时间范围本质上是包含费用的数据库的其他部分的索引。

然后在时间范围内(同步)找到当前日期的正确时间范围。

然后,使用正确的时间范围来获得该特定时间内该特定俱乐部的费用(异步)。

我不确定如何在resolve函数中构造我的承诺,以确保在加载状态之前可以创建和返回费用数组。

我故意在代码中忽略了所有的$q promise处理,这样比我更了解的人插入起来会更容易!是两次异步呼叫让我抓狂。

非常感谢!

代码语言:javascript
代码运行次数:0
运行
复制
.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;

}
EN

回答 1

Stack Overflow用户

发布于 2018-07-04 21:37:04

您可以将$q服务与递归函数结合使用,并在获得所有提要数据后对其进行解析。

代码语言:javascript
代码运行次数:0
运行
复制
.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)
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51173466

复制
相关文章

相似问题

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