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

use*_*646 1 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;
    });
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我按照以下方式为每个工厂调用相同的方式:

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

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

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

The*_*One 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;
});
Run Code Online (Sandbox Code Playgroud)