【问题标题】:angular factory for $http service makes call twice$http 服务的角度工厂调用两次
【发布时间】:2016-05-04 09:50:37
【问题描述】:

我为 $http 服务创建了一个角度工厂。我得到了响应并且能够在控制器中使用它,但问题是,当我在浏览器中检查网络选项卡时,http 请求被发出了两次

工厂:

app.factory('myService', function ($http, $q) {

var deferred = $q.defer();
var responseData = null;
var obj = {};

obj.getData = function(){
    $http.get('test.json').success(function(response){
        responseData = response;
        deferred.resolve(responseData);
    }).error(function(response){
        deferred.reject(responseData);
    });

    return deferred.promise;
}

obj.myData = function(){
    return responseData;
}

return obj;
});

控制器:

app.controller('myController', function($scope,myService){

myService.getData().then(function(){
   $scope.myDetails = myService.myData();
});

});

我的方法有什么问题。请给我一个解决方案

【问题讨论】:

  • 虽然我不会那样做,但那里一切都很好。你确定你没有在你的应用程序中绑定两次“myController”吗?

标签: javascript angularjs angular-services


【解决方案1】:

您制作缓存方案的方式非常复杂,而且没有真正的帮助。如何知道数据是否已经加载?

也许您可以创建一个简单的缓存服务来单点处理您的缓存(nr 代码行将会减少)。

angular.module("YourApp").factory("CachingService", [
    "$q",
    "$http",
    function ($q, $http,) {
        var cache = {};

        return {
            getFromCache: getFromCache
        };


        function getFromCache(url) {
            var deferred = $q.defer();

            if (cache[url]) {
                deferred.resolve(cache[url]);
            } else {
                return $http.get(url).then(function (result) {
                    cache[url] = result;
                    return result;
                });
            }
            return deferred.promise;
        }
     }
 ]);

然后,您只需在其他服务中调用它:

angular.module("YourApp").factory("myService", [
    "CachingService",
    function(CachingService){
        return {
             getData: getData
        };

        function getData(){
            return CachingService.getFromCache("test.json");
        }
    }
]);

然后,在你的控制器内部:

app.controller('myController', function($scope,myService){

    myService.getData().then(function(result){
       $scope.myDetails = result.Data;
    });

});

【讨论】:

    【解决方案2】:

    你可以返回$http 而不是deferred.promise

    【讨论】:

    • 虽然这可能会回答 OP 的问题,但它很短,我认为可以扩展它来描述为什么以及如何回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2016-07-20
    • 1970-01-01
    • 2017-05-26
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多