操作存储在 'promise' 中的结果

Manipulate the results stored within a 'promise'

我有一个 service,我想用它首先从 JSON 文件中抓取一个对象,然后 return 从所述对象中选择数据,这取决于用户请求。

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

我已将服务设置为每次加载页面仅请求一次 JSON 文件,但我在仅提取我希望 return.[=19 的数据时遇到了一些问题=]

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

}]);

问题是您到处重复使用同一个 tempStations 变量。这个变量应该是传递给 then().

的每个函数的局部变量