Czy usługi powinny ujawniać ich asynchroniczność?
Piszę usługę, która będzie pobierać dane asynchronicznie ($ http lub $ resource). Mogę ukryć fakt, że jest asynchroniczny, zwracając tablicę, która początkowo będzie pusta, ale w końcu zostanie wypełniona:
.factory('NewsfeedService1', ['$http', function($http) {
var posts = [];
var server_queried = false;
return {
posts: function() {
if(!server_queried) {
$http.get('json1.txt').success(
function(data) {
server_queried = true;
angular.copy(data, posts);
});
}
return posts;
}
};
}])
.controller('Ctrl1', ['$scope','NewsfeedService1',
function($scope, NewsfeedService1) {
$scope.posts = NewsfeedService1.posts();
}])
Albo mogę ujawnić asynchroniczność, zwracając obietnicę:
.factory('NewsfeedService2', ['$http', function($http) {
var posts = [];
var server_queried = false;
var promise;
return {
posts_async: function() {
if(!promise || !server_queried) {
promise = $http.get('json2.txt').then(
function(response) {
server_queried = true;
posts = response.data;
return posts;
});
}
return promise;
}
};
}])
.controller('Ctrl2', ['$scope','NewsfeedService2',
function($scope, NewsfeedService2) {
NewsfeedService2.posts_async().then(
function(posts) {
$scope.posts = posts;
});
// or take advantage of the fact that $q promises are
// recognized by Angular's templating engine:
// (note that Peter and Pawel's AngularJS book recommends against this, p. 100)
$scope.posts2 = NewsfeedService2.posts_async();
}]);
(Plunker - jeśli ktoś chce się pobawić powyższymi dwoma implementacjami.)
Jedną z potencjalnych zalet ujawnienia asychroniczności byłoby to, że mogę poradzić sobie z błędami w kontrolerze, dodając procedurę obsługi błędów dothen()
metoda. Jednak najprawdopodobniej będę łapać i obsługiwać błędy $ http w całej aplikacjiprzechwytujący.
Kiedy więc ujawnić asynchroniczność usługi?