在 Angular 中处理非幂等 $http 请求
Dealing with non-idempotent $http requests in Angular
我无法概念化如何 model/access 来自整个应用程序的非幂等请求的数据。
作为示例,我们假设我有一个 API returns 随机作者供用户查看。我需要在应用程序的不同位置显示关于该作者的信息,然后偶尔我需要重新调用 getNext
方法来获取下一个随机作者,并更新应用程序中的所有绑定。
我有以下工厂:
.factory('author', function($http) {
return {
data: {},
getNext: function() {
return $http.get('/path/to/endpoint').then(function(res) {
angular.copy(res.data, this.data)
return res;
}.bind(this));
};
});
然后在我的控制器中,我只需适当地绑定我的数据:
.controller('MainCtrl', function($scope, author) {
$scope.author = author.data;
author.getNext();
});
在我看来呈现的数据:
<h2>{{author.name}}</h2>
<div ng-repeat="book in author.books">
{{book.title}} - {{book.year}}
</div>
这行得通,但是将新对象复制到旧对象中以获取触发更新感觉有点老套。
此外,除了我最初调用它的控制器之外,我无法在任何其他控制器中访问 getNext
生成的承诺。我想做的是让 data
成为最后 getNext
被调用的承诺。这意味着如果我调用一个新的 getNext
,data
将成为新的承诺,并且我所有的 .then
将在加载时重新执行。
也许 data
需要成为 $q.defer()
然后我解决?
我不会让 'author' 服务充当作者实体,我只会将其用作 DAO。
.factory('Author', function($http) {
function AuthorService(){
this.getNext = function(){
return $http.get('/path/to/endpoint').then(function(res) {
return res.data;
})
}
};
return new AuthorService()
});
.controller('MainCtrl', function($scope, Author) {
Author.getNext().then(function(author){
$scope.author = author
});
});
我无法概念化如何 model/access 来自整个应用程序的非幂等请求的数据。
作为示例,我们假设我有一个 API returns 随机作者供用户查看。我需要在应用程序的不同位置显示关于该作者的信息,然后偶尔我需要重新调用 getNext
方法来获取下一个随机作者,并更新应用程序中的所有绑定。
我有以下工厂:
.factory('author', function($http) {
return {
data: {},
getNext: function() {
return $http.get('/path/to/endpoint').then(function(res) {
angular.copy(res.data, this.data)
return res;
}.bind(this));
};
});
然后在我的控制器中,我只需适当地绑定我的数据:
.controller('MainCtrl', function($scope, author) {
$scope.author = author.data;
author.getNext();
});
在我看来呈现的数据:
<h2>{{author.name}}</h2>
<div ng-repeat="book in author.books">
{{book.title}} - {{book.year}}
</div>
这行得通,但是将新对象复制到旧对象中以获取触发更新感觉有点老套。
此外,除了我最初调用它的控制器之外,我无法在任何其他控制器中访问 getNext
生成的承诺。我想做的是让 data
成为最后 getNext
被调用的承诺。这意味着如果我调用一个新的 getNext
,data
将成为新的承诺,并且我所有的 .then
将在加载时重新执行。
也许 data
需要成为 $q.defer()
然后我解决?
我不会让 'author' 服务充当作者实体,我只会将其用作 DAO。
.factory('Author', function($http) {
function AuthorService(){
this.getNext = function(){
return $http.get('/path/to/endpoint').then(function(res) {
return res.data;
})
}
};
return new AuthorService()
});
.controller('MainCtrl', function($scope, Author) {
Author.getNext().then(function(author){
$scope.author = author
});
});