$http.get 在服务中调用...我应该在哪里处理承诺?

$http.get called in a service... where I should handle the promise?

如果我在服务中处理它(我将数据分配给一个属性),当数据最终到来时,控制器并没有得到值。如果我用 promise 本身来回应,没关系,我可以从控制器获取数据。但是,如果有更多控制器依赖于同一个服务,并且我希望它们都获得最新数据,会发生什么情况?

是否有从服务到控制器的通知机制?

我想这真的是一个偏好的事情,因为你可以做任何一个。我更喜欢 return promise 并在控制器中处理它,原因如下:

  1. 调用失败时的正确错误处理。您可以用不同的方式处理失败的调用,具体取决于您所在的控制器。
  2. 一致性。您知道,每次使用该服务时,您都会得到一个承诺。这也可以扩展到您的整个项目。

要解决你的第二个问题,我想你有几个选择。首先,您可以管理您的范围层次结构并使用 broadcasting or emitting 将您的数据告知其他子控制器。你可以在你的控制器中做这样的事情:

myService.getData().success(function (data) {
  // do something with results
  $scope.$broadcast('GOT_DATA', data);
});

然后在 child/parent 控制器中:

$scope.$on('GOT_DATA', function(event, data) {
  // use data in another controller
});

您还可以考虑 caching 您的服务结果,同时 return 兑现您的承诺。然后,每当另一个控制器调用该函数时,它们都会获得与上一次调用相同的数据。这意味着你可以将你的服务注入到任何你想要的控制器中,然后每个控制器都可以在不同的时间获取数据,但它会与原始请求相同。