我对angularJS服务有疑问 .
根据我的阅读,有两种使用服务的方式 .
[1]让服务返回承诺返回数据 . 如果使用此方法,则在routeProvider中,您可以确保Angular解析此承诺,以便在加载页面之前返回数据 .
例如
App.factory('BooksService', function($q, $http) {
var deferred = $q.defer();
$http.get('/rest/books').then(function(data) {
deferred.resolve(data);
}, function(err) {
deferred.reject(data);
});
return deferred.promise;
};
然后,在我的路线提供者:
...
$routeProvider.when('/books', {
controller : 'BooksCtrl',
templateUrl: '/partials/books.html',
resolve: {
books: 'BooksService'
}
});
...
然后,在我的控制器中:
App.controller('AddPaypalAccountCtrl', function($scope, BooksService) {
$scope.books = BooksService;
}
[2]让服务返回包含函数和数据的对象 .
例如
App.factory('BooksService', function($q, $http) {
var books = [];
var service = {
getBooks : function() {
return books;
},
addBook: function(book) {
books.push(book);
}
};
return service;
};
我的问题:是否有可能充分利用这两个世界并让服务返回一个承诺,当解析时返回一个包含函数和数据的对象?
在加载'/ books'页面之前,我想要$ http调用来解析书籍,但我也希望能够访问可以管理所述书籍的服务 . 当然我可以编写两个单独的服务,但是我想知道将它们保存在同一个服务中是否更有效率并编写一个像一条石头一样杀死两只鸟的服务:
这是我的工厂的一个例子,它返回了检索书籍的承诺 .
App.factory('BooksService', function($q, $http) {
var books = [];
var service = {
getBooks: function() {
return books;
},
addBook: function(book) {
books.push(book);
}
}
var deferred = $q.defer();
$http.get('/books').then(function(data) {
books = data.data;
deferred.resolve(service);
, function(err){
deferred.reject(err);
});
return service;
};
然后,按照以前的说法,我的路线提供商如下,要求在我进入/ books页面之前检索书籍:
...
$routeProvider.when('/books', {
controller : 'BooksCtrl',
templateUrl: '/partials/books.html',
resolve: {
books: 'BooksService'
}
});
...
然后,在我的控制器中,我会将书籍附加到范围内 .
App.controller('AddPaypalAccountCtrl', function($scope, BooksService) {
$scope.books = BooksService.getBooks();
}
我还没有看到有人这样做过,所以我想知道这是否合适 .
1 回答
我觉得你正试图打破SRP - 单一责任原则 .
您的服务的责任是什么?为异步请求提供API或发出请求?如果它提供API,则不应加载异步 . 如果也是请求,它应该是服务的方法,而不是服务本身 . 服务是您的请求的接口,而不是请求!
您很少需要从服务器获取逻辑,但同样,您必须分开关注:
从服务器获取逻辑(例如,Angular表达式作为字符串) .
解析为执行逻辑的函数(可以使用Angular
$parse
服务完成) .在需要使用它的地方注入逻辑功能 .