我在构思如何在整个应用程序中从非幂等请求建模/访问数据时遇到了麻烦。

作为示例,我们将说我有一个API,该API返回一个随机作者供用户查看。我需要在应用程序的各个位置显示有关该作者的信息,然后偶尔需要调用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()

最佳答案

我不会以“作者”服务作为作者实体,而只是将其用作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
      });
});

关于javascript - 在Angular中处理非幂等$ http请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28997230/

10-10 11:51