使AngularJS服务调用异步

时间:2014-05-06 16:13:09

标签: json angularjs asynchronous service promise

我已经阅读了关于“promise”对象以及获取某种异步调用的所有方法,或者等到http调用完成后,但我还没有成功。这就是我得到的以及我想要做的事情:

我需要从我的服务器获取一些json文件,并在我的代码(js文件)中使用该json中的数据,而不仅仅是我的HTML模板的数据。

我有一个服务来调用json文件:

mobilityApp.service('serveiWebservices', function($resource) {       
    return {        
        getWS: function($scope) {           
            var path = 'jsonWS/context.json';
            $resource(path).get(function (data) {                                                       
                console.log(data); //data is printed fine
                $scope.returnData = data; //just to test, it doesn't work neither
                return data;            
            });
        }
    };    
});

从我的控制器中我称之为:

var data = serveiWebservices.getWS($scope);     
console.log(data); //undefined

关于如何使用函数返回的promise对象并在获取所请求的数据后立即执行操作的任何想法?我知道我可以设置“成功”功能,但我不想使用回调。

提前Tnanks!

2 个答案:

答案 0 :(得分:4)

这应该有效 -

服务:

mobilityApp.service('serveiWebservices', function($http) {       
    return {        
        getWS: function() {           
            var path = 'jsonWS/context.json';
            return $http.get(path, function (response) {                                                       
                console.log(JSON.stringify(response, null, 4));
                return response.data;            
            });
        }
    };    
});

控制器:

serveiWebservices.getWS().then(function(data) {
    console.log(JSON.stringify(data, null, 4));
});

如果您想使用$resource,这也应该有效 -

mobilityApp.service('serveiWebservices', function($resource) {       
    return {        
        getWS: function() {           
            var path = 'jsonWS/context.json';
            return $resource(path).get(function (response) {                                               
                console.log(JSON.stringify(response, null, 4));
                return response; // might just be response, no response.data
            });
        }
    };    
});

答案 1 :(得分:1)

我正在寻找一个有效的解决方案。谢谢@Ross。

这也有效,我修改了Ross示例,并删除了第一个返回:

mobilityApp.service('serveiWebservices', function($http) {       
    this.getWS = function() {           
        var path = 'jsonWS/context.json';
        return $http.get(path, function (response) {                                                       
            console.log(JSON.stringify(response, null, 4));
            return response.data;            
        });
    }
    this.getWS2 = function() {           
        var path = 'jsonWS2/context.json';
        return $http.get(path, function (response) {                                                       
            console.log(JSON.stringify(response, null, 4));
            return response.data;            
        });
    }
});

如果我在这个服务中获得了很多功能,我应该使用Ross示例和返回中的所有函数吗?感谢