Получить массив из разрешения ui-маршрутизатора, содержащий два асинхронных вызова в цикле - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь получить массив из разрешения UI-Router в AngularJS (используя Firebase).

Массив содержит членские взносы разных клубов. Сборы клубов меняются в разное время, поэтому в массив необходимо указать правильную плату за конкретный момент времени.

Клубы повторяются в цикле for.

Для каждого клуба:

Сначала для каждого клуба получаются временные диапазоны (асинхронно). Каждый временной диапазон - это объект, который показывает время, за которое была определенная плата (date_active и date_ends). Временные диапазоны по сути являются индексом для другой части базы данных, которая содержит сборы.

Правильный временной диапазон для текущей даты будет найден в пределах временных диапазонов (синхронно).

Затем используется правильный диапазон времени, чтобы получить плату за этот конкретный клуб за это конкретное время (асинхронно).

Я не уверен, как структурировать свои обещания в рамках этой функции разрешения, чтобы гарантировать, что массив платежей может быть создан и возвращен до загрузки состояния.

Я намеренно оставил в коде обработку всех обещаний $ 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 голосов
/ 04 июля 2018

Вы можете использовать службу $ 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)
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...