AngularJS:阻止调用多个$ http请求以获取相同的数据

时间:2014-03-18 18:14:04

标签: ajax angularjs http promise deferred

我仍然不了解Promise API的工作原理。我想知道是否有办法在我需要的时候获取数据而无需调用多个HTTP请求。这是一个例子:

会话服务: 它所做的只是获取会话对象(包含数据)或获取返回数字的会话ID。

app.factory('sessionFactory', ['$resource', 'requestFactory',
function ($resource, requestFactory) {

    var oSession = {};

    var session = {
        /**
         * Get session ID
         * @return {Number}
         */
        sessionID: function () {
            if (typeof oSession.id !== "undefined") {
                return oSession.id;
            } else {
                return requestFactory.getObject('/application/current_session').then(function (response) {
                    oSession = response;
                    return oSession.id;
                });
            }
        },

        /**
         * Get session object (GET)
         * @return {Object} data in JSON format
         */
        getCurrentSession: function () {
            if (!oSession.id) {
                return requestFactory.getObject('/application/current_session').then(function (response) {
                    oSession = response;
                    return oSession;
                });
            }
        }
    };

    return session;

}]);

请求HTTP服务: 此服务仅执行HTTP请求。

app.factory('requestFactory', ['$http', '$q', '$timeout',
function ($http, $q, $timeout) {
    return {
        getObject: function (jsonURL, params) {
            // $q service object
            var deferred = $q.defer();

            // regular ajax request
            $http({
                method: 'GET',
                url: jsonURL,
                params: params
            })
                .success(function (result, status, headers, config) {
                    // promise resolve
                    deferred.resolve(result);
                })
                .error(function (result, status, headers, config) {
                    // called asynchronously if an error occurs
                    // or server returns response with an error status.
                    deferred.reject('Erreur request : ' + status);
                });

            return deferred.promise;
        }
    };
}]);

因此,为了获得我的Session对象,我使用回调函数(然后......)执行sessionFactory.getCurrentSession,它完美无缺。稍后,我只需要获取会话ID,所以我会做sessionFactory.sessionID,但它只有在我添加回调函数(然后......)时才有效,为什么会这样?我认为自第一个HTTP请求以来,我的全局JavaScript对象oSession已经拥有数据。

我想防止做一个意大利面条代码并尽可能保持代码干净,采用更多对象方法。有可能吗?

2 个答案:

答案 0 :(得分:0)

看起来你正试图用promise API做太多。它已经内置在$ http服务中,因此您不需要自己调用它。试试这个:

app.factory('requestFactory', ['$http',
function ($http) {
    return {
        getObject: function (jsonURL, params) {
            // regular ajax request
            return $http({
                method: 'GET',
                url: jsonURL,
                params: params
            })
                .success(function (result, status, headers, config) {
                    return result;
                })
                .error(function (result, status, headers, config) {
                    // called asynchronously if an error occurs
                    // or server returns response with an error status.
                    throw new Error('Erreur request : ' + status);
                });
        }
    };
}]);

通过返回$ http调用的结果,您实际上是在返回一个promise。然后,您可以将其他分辨率代码链接到返回值。请参阅$q documentation的“链接承诺”部分。

答案 1 :(得分:0)

如果您想缓存之前的http响应,以便它不会再次进行http调用

  1. 您可以使用angular-cached-resource

      

    bower安装angular-cached-resource

         

    angular.module('对myApp' [' ngCachedResource'])

    而不是$resource使用$cachedResource,它会将网络调用缓存到本地存储,每次进行调用时它都会立即解析,即使它调用后端并更新缓存。

  2. 您还可以使用angular-cache它将缓存您可以设置超时的所有http get调用,并在其配置中排除url

  3.   

    bower install angular-cache