AngularJS——你是否从service/factory返回承诺或数据?



在我的控制器中,我使用来自工厂的方法来更新一些数据。例如,我试图获取一个更新的用户数组。我应该把承诺本身从工厂退回去吗?或者我应该从承诺返回数据(不确定我的措辞是否正确)?

我问这个问题是因为我看到了两种情况,有些人说控制器不应该处理请求是否成功或失败。我在这里特别讨论的是从$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,它将被链接。所以servicethen将执行,之后,控制器的。

我对控制器决定基于响应失败/成功做什么没有问题。事实上,它可以让你很容易地处理不同的情况,并不会给控制器增加太多的开销(控制器应该尽可能小,专注于当前任务,但对我来说,如果请求失败是其任务的一部分,则走不同的路径)。

无论如何,在Angular中,HTTP请求在内部被封装在承诺中(我记得在以前的版本中有一种自动展开它们的方法),所以从service/factory返回总是返回一个承诺,这个承诺必须被解析。

我更喜欢从服务/工厂返回承诺,因为我倾向于让其他类决定如何处理响应。

最新更新