Angularjs 角度js$http工厂模式

Angularjs 角度js$http工厂模式,angularjs,angular-promise,Angularjs,Angular Promise,我有一个名为“用户服务”的工厂 .factory('userService', function($http) { var users = []; return { getUsers: function(){ return $http.get("https://www.yoursite.com/users").then(function(response){ users = response;

我有一个名为“用户服务”的工厂

.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];
        }
    }
})
在第一页中,单击按钮“我想调用getUsers函数”,它将返回“users”数组

我想在第二页中使用“用户”数组。我怎么做

注意:我使用getter和setter将响应存储在第一页,并在第二页访问相同的响应。每个人都是这样做的吗。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)。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);
});

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

.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");
                });
            }
        },
    };
售后服务呼叫在公共数据工厂中设置响应数据,以便整个应用程序都可以访问该数据
在上面的代码中,我使用了公共数据工厂来存储响应。

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

.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");
                });
            }
        },
    };
售后服务呼叫在公共数据工厂中设置响应数据,以便整个应用程序都可以访问该数据
在上面的代码中,我使用了公共数据工厂来存储响应。

getUser()
方法中包含逻辑,以处理
users
为空或null的情况,这可能也是谨慎的做法。@Brett我同意。但是我仍然怀疑什么方法更好:在用户不可用时调用
getUser
时抛出错误,或者让
getUser
也返回像
getUsers
这样的承诺@dfsq谢谢你的回答。我所做的是创建了两个函数,第一个用于服务调用,另外一个用于为数据分配响应。在第二个函数中,我返回数据。但是,如果我反复拨打服务电话,相同的数据将被转发。我希望你的回答能解决这个问题@dfsq当数据不可用时,我也有同样的疑问,什么是更好的方法?我们应该在工厂本身还是在控制器中进行后处理?@GangadharJannu我会让
getUser
也返回承诺,就像我在回答第2点中描述的那样。这样,我们可以确保总是在用户数组可用后检索用户。在
getUser()
方法中包含逻辑,以处理
users
为空或null的情况,这可能也是谨慎的做法。@Brett我同意。但是我仍然怀疑什么方法更好:在用户不可用时调用
getUser
时抛出错误,或者让
getUser
也返回像
getUsers
这样的承诺@dfsq谢谢你的回答。我所做的是创建了两个函数,第一个用于服务调用,另外一个用于为数据分配响应。在第二个函数中,我返回数据。但是,如果我反复拨打服务电话,相同的数据将被转发。我希望你的回答能解决这个问题@dfsq当数据不可用时,我也有同样的疑问,什么是更好的方法?我们应该在工厂本身还是在控制器中进行后处理?@GangadharJannu我会让
getUser
也返回承诺,就像我在回答第2点中描述的那样。通过这种方式,我们可以确保总是在用户数组可用之后检索用户。