I suppose this is really a preference thing, because you can do either. I prefer to return the promise and deal with it in the controller, for the following reasons:
- Proper error handling if your call fails. You can handle a failing call in different ways, depending on which controller you're in.
- Consistency. You know that every time you use that service you'll get a promise back. This can be extended to your entire project too.
To solve your second problem, I think you have a few options. First, you can manage your scope hierarchy and use broadcasting or emitting to tell other child controllers about your data. You could do something like this in your controller:
myService.getData().success(function (data) {
// do something with results
$scope.$broadcast('GOT_DATA', data);
});
Then in a child/parent controller:
$scope.$on('GOT_DATA', function(event, data) {
// use data in another controller
});
You could also consider caching the results in your service while also returning your promise. Then, whenever another controller calls that function, they get the same data as the previous call. This means you can inject your service into any controller you want, and then each of them can get data at different times but it will be the same as the original request.