Angular js $ http工厂模式

时间:2014-10-30 15:35:01

标签: angularjs angular-promise

我有一个名为'userService'的工厂。

.factory('userService', function($http) {
    var users = [];

    return {
        getUsers: function(){
            return $http.get("https://www.yoursite.com/users").then(function(response){
                users = response;
                return users;
            });
        },
        getUser: function(index){
            return users[i];
        }
    }
})

在第一页,单击On按钮我想调用getUsers函数,它将返回'users'数组。

我想在第二页中使用'users'数组。我该怎么办?

P.s:我正在使用getter和setter将响应存储在第一页中,并在第二页中访问相同的内容。这是每个人都在做的事吗?

2 个答案:

答案 0 :(得分:3)

<强> 1)。 getUsers 即可。为了保持一致,我仍然会在第二页上使用相同的服务方法,但我还会添加数据缓存逻辑:

.factory('userService', function($q, $http) {

    var users;

    return {
        getUsers: function() {
            return users ? $q.when(users) : $http.get("https://www.yoursite.com/users").then(function(response) {
                users = response;
                return users;
            });
        },
        getUser: function(index){
            return users[i];
        }
    };
});

现在在第二页上,使用情况与第一页上的情况相同:

userService.getUsers().then(function(users) {
    $scope.users = users;
});

但此承诺将立即解决,因为用户已加载并可用。

<强> 2)。的getUser 即可。将getUser方法转换为异步也是有意义的:

getUser: function(index){
    return this.getUsers().then(function(users) {
        return users[i];
    });
}

并在控制器中以这种方式使用它:

userService.getUser(123).then(function(user) {
    console.log(user);
});

答案 1 :(得分:2)

这是我在自己的项目中遵循的模式。你可以看到下面的代码

.factory('userService', function($http) {
return {
        serviceCall : function(urls, successCallBack) {

                $http({
                    method : 'post',
                    url : url,
                    timeout : timeout
                }).success(function(data, status, headers, config) {
                        commonDataFactory.setResponse(data);
                }).error(function(data, status, headers, config) {
                        commonDataFactory.setResponse({"data":"undefined"});
                        alert("error");
                });
            }
        },
    };

在服务调用之后,在公共数据工厂中设置响应数据,以便可以在整个应用程序中访问它

在上面的代码中,我使用了通用数据工厂来存储响应。