如何从服务中获取数据 - 将延迟提取的数据

时间:2013-05-26 07:04:51

标签: angularjs angularjs-service

我声明了以下服务:

app.factory('data', ['$http', function ($http) {

        var dataRecords = {};

        //Retrieve the entries from the data file and categorize them according
        //to the information types located in the overview page
        $http.get('data.json')
            .success(function (records) {
                    //Fill the dataRecords variable
        });

        return {
            get: function () {
                return dataRecords;
            },
            setNew: function (newRecords) {
                dataRecords = newRecords;
            }
        };
    }]);

可以看出,使用$http我从data.json文件中获取数据。现在我的问题是,当我调用数据服务的get方法时,即使data.json不为空,我也会返回空记录。

据我所知,$http.get()将会有一些延迟返回数据,因此当我调用get时,它仍然没有被填充,因此我得到空值。

当我从服务中提取数据时,如何调用服务并确保数据已填满?

2 个答案:

答案 0 :(得分:1)

你做错了。我认为正确的方法是:

app.factory('MyService', ['$http', function ($http) {

    var dataRecords = {};

    return {
        get: function (success) {
            $http.get('data.json').success(success) {});
        }
    };
}]);

并称之为

 MyService.get(function(response) {
      //on success
 });

因此,您希望使用http.get初始化您的服务。这不是一件容易的事。但是在SO上已经存在这样的问题:AngularJS : Initialize service with asynchronous data


但是你也可以这样做:

app.factory('MyService', ['$http', function ($http) {

    var myService = {};

    myService.get = function () {
        return myService.records;
    }

    myService.load = function(){
        $http.get('data.json').success(function(response){
             myService.records = response;
             return myService.records;
        }) {});
    }

    return myService;
}]);

在控制器中:

if(typeof MyService.get() === 'undefined'){
    $scope.records = MyService.load();
}

在控制器初始化时,数据将被提取一次。

答案 1 :(得分:1)

继续@ artowrkad的例子,如果你只想让它只获得一次,那么只需要实现逻辑就不要再这样了:

app.factory('MyService', ['$http', function ($http) {

    var dataRecords = false;

    return {
        get: function (successCallback) {
            if(!dataRecords){
                $http.get('data.json').success(function(data){
                    dataRecords = data;
                    successCallback(data);
                ));
            }
            else{
                successCallback(dataRecords);
            }
        }
    };
}]);

你甚至可以改进它,这样如果你在第二次调用等待时运行$ http.get,然后在完成后进行回调。