操纵存储在“承诺”中的结果。

时间:2015-08-19 16:26:02

标签: angularjs angularjs-service angular-promise

我有一个service,我希望用它来首先从JSON文件中获取一个对象,然后从所述对象返回所选数据,具体取决于用户请求的内容。

每次访问可能会多次使用此服务,因此我不希望用户在每次检索数据时都要等待。

我已将服务设置为每页加载仅请求一次JSON文件,但我只是在提取我想要返回的数据时遇到了一些问题。

我的想法是在返回克隆对象之前,先删除初始promise对象(在我的代码中称为promiseAll),然后在其中操作数据(称为&# 39; 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
    };

}]);

1 个答案:

答案 0 :(得分:1)

问题是您在任何地方都重用了相同的tempStations变量。该变量应该是传递给then()的每个函数的本地变量。