如何防止AngularJS应用程序中重复的$ http请求?

时间:2015-12-17 07:24:46

标签: angularjs angularjs-http angular-providers angularjs-config

我需要阻止在上一个请求给出响应之前重复向API发送相同的请求。我找到了一些解决方案。但是,我不想在等待响应时禁用该按钮,因为我的应用程序中有更多的API调用。

我真的需要在我的$ provider .config()中做点什么。我在这里找到了一种方法(http://blog.codebrag.com/post/57412530001/preventing-duplicated-requests-in-angularjs)。

但我需要更多澄清代码。任何关于此的参考都是受欢迎的。

4 个答案:

答案 0 :(得分:2)

假设您的$http文件中有controller.js

许多请求服务器

$http.get('/link/to/file.php');

只需向服务器发出一个请求,无论您多少次调用此方法:

$http.get('/link/to/file.php', {cache: true});

示例:

(function() {
    'use strict';

    angular
            .module('yourModuleName')
            .controller('DashboardCtrl', DashboardCtrl);

    DashboardCtrl.$inject = ['$scope'];

    function DashboardCtrl($scope) {

       $scope.get = function () {
           $http.get('/link/to/file.php', {cache: true}).then(function(response) {
               // it will do GET request just once
               // later you will get the same response from cacheFactory
           })
       }
    }

}());

答案 1 :(得分:1)

我想补充@VikasChauhan的答案,但我没有足够的声誉评论他的回答。

他的代码对我很有用,除了他返回null的部分。这导致Angular全面抛出一堆错误。

而不是null,我只是拒绝请求:

return $q.reject(request);

这是我的功能:

$httpProvider.interceptors.push(['$injector', '$q', function interceptors($injector, $q) {
    return {
        // preventing duplicate requests
        request: function request(config) {
            var $http = $injector.get('$http');
            var _config = angular.copy(config);
            delete _config.headers;

            function isConfigEqual(pendingRequestConfig) {
                var _pendingRequestConfig = angular.copy(pendingRequestConfig);
                delete _pendingRequestConfig.headers;

                return angular.equals(_config, _pendingRequestConfig);
            }

            if ($http.pendingRequests.some(isConfigEqual)) {
                return $q.reject(request);
            }

            return config;
        }
    };
}
]);

希望这有助于其他人。

答案 2 :(得分:0)

您可以创建一个功能来取消第一个http请求,在按钮单击时调用另一个http请求。 这是一个使用$ q.defer()函数的参考,它帮助我解决了类似的问题: http://odetocode.com/blogs/scott/archive/2014/04/24/canceling-http-requests-in-angularjs.aspx

答案 3 :(得分:0)

在我的项目中,我遇到了这个问题。我找到了一个非常有用的工作解决方案here

并在config:

中实现
function config($routeProvider, $httpProvider) {

    $httpProvider.interceptors.push(['$injector', function interceptors($injector) {
        // Manually injecting dependencies to avoid circular dependency problem
        return {
            // preventing duplicate requests
            'request': function request(config) {
                var $http = $injector.get('$http'),
                copiedConfig = angular.copy(config);

                delete copiedConfig.headers;
                function configsAreEqual(pendingRequestConfig) {
                    var copiedPendingRequestConfig = angular.copy(pendingRequestConfig);

                    delete copiedPendingRequestConfig.headers;

                    return angular.equals(copiedConfig, copiedPendingRequestConfig);
                }

                if ($http.pendingRequests.some(configsAreEqual)) {
                    debugger;
                    return null;
                }

                return config;
            }
        }
    }
    ]);
}