如何防止对服务器的相同请求?

时间:2015-12-29 14:56:41

标签: angularjs promise

我的控制器和服务具有缓存值。



app.service('nameService', ['$q','$http', function($q, $http){
    var that = this;

    that.name = null;

    this.index = function(){
        var deferred = $q.defer();

        if (that.name !== null) {

            // fired cahed value
            console.log('cashed');

            deferred.resolve(that.name);

        } else {
            $http.get('/api/name').success(
                function(response) {

                    // fired request to server
                    console.log('server');

                    that.name = response.name;
                    deferred.resolve(that.name);

                }
            );
        }

        return deferred.promise;
}]);




当控制器中的请求发送时间间隔为



app.controller('nameCtr', ['$scope', '$timeout', 'nameService'], 
                function($scope, $timeout, nameService){

    nameService.index(); // console.log server
  
    $timeout(function(){
    
        nameService.index(); // console.log cached
      
    },3000)
    
    $timeout(function(){
    
        nameService.index(); // console.log cashed
      
    },6000)
  
}]);




一切正常,首先请求被解雇server,其他被解雇cached。 但是如果我毫不拖延地发送请求,我会向服务器发送多个请求。喜欢:



...
nameService.index(); // console.log server
nameService.index(); // console.log server
nameService.index(); // console.log server
...




他们都解雇了server,但我需要缓存。我有多个控制器具有相同的服务。向服务器发送一个请求的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  

如何阻止对服务器的相同请求?

好吧,您可以将$http.get('/api/name')更改为$http.get('/api/name', {cache: true}),这实际上已内置到Angular中并且运行正常。

这带来了一个有趣的问题,即如何在不使用Angular帮助实现通用承诺的情况下实现这一目标 - 同样简单:

this._data = null;
this.index = function() { 
    return this._data || (this._data = $http.get('/api/name'));
}

这样,如果它被缓存,它将返回左侧,如果不是,它将缓存右侧。

重要的是我们缓存了承诺而不是数据。那是你一直缺少的“诡计”。

答案 1 :(得分:0)

你可以通过下一步来做到这一点

app.service('nameService', ['$q','$http', function($q, $http){
    var that = this;

    that.nameDeffered = null;

    this.index = function(){
        if (that.nameDeffered === null) {
            that.nameDeffered = $q.defer();
            $http.get('/api/name').success(
                function(response) {
                    // fired request to server
                    console.log('server');                        
                    that.nameDeffered.resolve(response.name);
                }
            );
        }

        return that.nameDeffered.promise;
    }
}]);