如何让我的angularjs工厂只获取一次http数据?

时间:2014-08-06 15:36:18

标签: javascript angularjs

我正在使用工厂在多个控制器之间共享数据,这是我的工厂

    var szGetData = "some url that works";
    myApp.factory('Data', function ($http) {
        var eventData = {};
        eventData.getEvent = function (event) {
                return $http.get(szGetData, event);
            }
        return eventData;
    });

在我的控制器中,我按照以下方式对工厂进行相同的调用:

        Data.getEvent()
            .success(function (event) {
                $scope.eventData = event;

            })
            .error(function (error) {
                $scope.status = 'Unable to load customer data: ' + error.message;
            });

这一切都有效,我得到数据,但它调用我的网络服务三次,每个控制器都有自己的数据副本。我想让控制器使用相同的数据,只调用一次Web服务。谢谢你的建议。

1 个答案:

答案 0 :(得分:5)

您可以跟踪待处理的承诺,并向所有后续呼叫者返回相同的承诺。

可选地,如果请求失败,您可以“重置”承诺,以便下次getEvent被调用(失败后),它将再次尝试。

var szGetData = "some url that works";
myApp.factory('Data', function ($http) {
    var eventData = {};
    var promise;
    eventData.getEvent = function (event) {
        if(!promise){
            promise = $http.get(szGetData, event)
                .error(function(){ // this is optional
                    promise = false;
                });
        }
        return promise;
    }
    return eventData;
});