Управлять результатами, хранящимися в «обещании»

0

У меня есть service которую я хочу использовать, чтобы сначала захватить объект из файла JSON, а затем вернуть выбранные данные из указанного объекта, в зависимости от того, что пользователь запрашивает.

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

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

Моя идея состояла в том, чтобы взять клон исходного promise объекта (называемый promiseAll в моем коде), а затем манипулировать данными в пределах, прежде чем вернуться, что клонированный объект (называемый "promiseSelected") для пользователя.

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

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

Вот как я пользуюсь service -

app.controller('searchCtrl', ['$scope', '$localStorage', '$stationsList', function($scope, $localStorage, $stationsList){

    $stationsList.getList('searchable').then(function(data){
        $scope.stationsList = data; // Grab a list of searchable stations
    });

}]);

И вот полный service -

app.service('$stationsList', ['$http', function($http, $scope){

    var tempStations,
        promiseAll,
        promiseSelected;

    /**
     * Grab a list of the required stations
     *
     * @param string type               The type of list to return
     * @return object promiseSelected   A promise object containing the stations requested by the user
     */
    var getStationsList = function(type){

        if(!promiseAll){

            promiseAll = $http.get('stations.json').then(function(res){
                return res.data;    // Grab the JSON list of all stations
            });

        }

        promiseSelected = angular.copy(promiseAll); // Take a fresh copy of 'promiseAll'
        tempStations = [];                          // Reset to an empty array

        switch(type){

            case "searchable":

                promiseSelected = promiseAll.then(function(data){

                    [].map.call(data || [], function(elm){  // Map all stations...
                        if (elm.link.indexOf(".xml") > -1)  // Check to see if the station is searchable
                            tempStations.push(elm);         // It is - add the station to 'tempStations'
                    });

                    return tempStations;

                });

                break;

            case "locatable":

                promiseSelected = promiseAll.then(function(data){

                    [].map.call(data || [], function(elm){  // Map all stations...

                        if(
                        isFinite(parseFloat(elm.latitude)) &&
                        isFinite(parseFloat(elm.longitude))
                        )                                   // Check to see if the station is locatable
                            tempStations.push(elm);         // It is - add the station to 'tempStations'

                    });

                    return tempStations;

                });

                break;

            default:
                promiseSelected = promiseAll;

        }

        return promiseSelected;

    };

    return{
        getList: getStationsList
    };

}]);
  • 0
    Ваш клон бесполезен и в любом случае не используется вашим кодом. Мне трудно понять, что вы ожидаете, и что происходит вместо этого. Проблема, вероятно, в том, что вы повторно используете одну и ту же переменную tempStations. Эта переменная должна быть локальной для каждой функции, передаваемой в then ().
  • 0
    Это простое небольшое изменение, кажется, сделало работу. Пожалуйста, отметьте это как ответ, и я был бы рад принять.
Теги:
angular-promise
angularjs-service

1 ответ

1
Лучший ответ

Проблема в том, что вы повторно используете ту же tempStations переменную tempStations. Эта переменная должна быть локальной для каждой функции, переданной then().

  • 0
    Спасибо за совет, я постараюсь запомнить это в будущем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню