在我的控制器中,我使用来自工厂的方法来更新一些数据。例如,我试图获取一个更新的用户数组。我应该把承诺本身从工厂退回去吗?或者我应该从承诺返回数据(不确定我的措辞是否正确)?
我问这个问题是因为我看到了两种情况,有些人说控制器不应该处理请求是否成功或失败。我在这里特别讨论的是从$http返回的承诺。
或者换句话说,我应该在工厂内使用then()方法,还是应该在从工厂返回后在控制器中使用它?
我已经尝试从服务中处理成功和错误回调(使用this()方法),但是当我将数据返回给控制器时,用户数组没有正确更新。我假设这是因为请求是异步的。在控制器中,它看起来像这样:
vm.users = userFactory.getUsers();
如果我在控制器中处理promise,并在then()方法中设置users数组,它工作得很好。但是这回到了我应该使用then()的地方:
userFactory.getUsers().then(
function(data){
vm.users = data;
}, ...
希望有人能够阐明这一点或提供一些输入。谢谢!
如果不使用callback
方法(不鼓励),则无法从工厂返回数据(因为它是异步调用):
userFactory.prototype.getUsers = function(callback){
$http.get('users').then(function (response) {
callback(response.data);
});
};
或承诺方法。
如果你担心处理控制器上的错误,那么不用担心!你可以在服务上处理错误:
userFactory.prototype.getUsers = function(){
return $http.get('users').then(function(response) {
return response.data;
}, function(error) {
// Handle your error here
return [];
});
};
你可以return
的结果then
,它将被链接。所以service
和then
将执行,之后,控制器的。
我对控制器决定基于响应失败/成功做什么没有问题。事实上,它可以让你很容易地处理不同的情况,并不会给控制器增加太多的开销(控制器应该尽可能小,专注于当前任务,但对我来说,如果请求失败是其任务的一部分,则走不同的路径)。
无论如何,在Angular中,HTTP请求在内部被封装在承诺中(我记得在以前的版本中有一种自动展开它们的方法),所以从service/factory返回总是返回一个承诺,这个承诺必须被解析。
我更喜欢从服务/工厂返回承诺,因为我倾向于让其他类决定如何处理响应。