Запрос JSONP службы Angular с настраиваемым обратным вызовом

Я использую каналы JSONP с пользовательскими функциями обратного вызова, например:

jsonpCallbackAllStar2015({
    "events": [
        {
            "title": "XYZ"
        }
        ...
    ]
})

Я могу сделать это, используя решение, опубликованное здесь, например так:

var jsonUrl = 'http://i.cdn.turner.com/nba/nba/.element/media/2.0/teamsites/warriors/json/json-as2015.js?callback=JSON_CALLBACK' + (new Date().getTime());

$http.jsonp(jsonUrl);

window.jsonpCallbackAllStar2015 = function(data) {
    $scope.events = data.events;
}

Однако теперь я хотел бы сделать это в службе, чтобы я мог загружать данные один раз и вводить их во все мои контроллеры. Однако, когда я пытаюсь это сделать, я получаю ошибку $injector undefined, которую я Я предполагаю, что служба не возвращается достаточно быстро:

eventsFactory.$inject = ['$http'];
function eventsFactory($http) {
    var jsonUrl = 'http://i.cdn.turner.com/nba/nba/.element/media/2.0/teamsites/warriors/json/json-as2015.js?callback=JSON_CALLBACK' + (new Date().getTime());

    $http.jsonp(jsonUrl);

    window.jsonpCallbackAllStar2015 = function(data) {
        return data.events;
    }
}

Можно ли это как-то исправить или мне придется повторять запрос jsonp в каждом контроллере? Вот скрипка.


person dougmacklin    schedule 27.02.2015    source источник


Ответы (1)


Хотя это не красивое решение, оно должно сработать для вас. Я добавил очень простое кэширование. Я не использовал jsonp в angular, и кажется, что установка кеша в конфигурации $http не работает. Это был бы лучший вариант.

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

        var pub = {};

        var jsonUrl = 'http://i.cdn.turner.com/nba/nba/.element/media/2.0/teamsites/warriors/json/json-as2015.js?callback=JSON_CALLBACK' + (new Date().getTime()),
            cachedResponse;

        pub.getEvent = function() {

            var deferred = $q.defer();

            if ( cachedResponse ) {
                deferred.resolve( cachedResponse );
            }

            else {

                $http.jsonp( jsonUrl );

                window.jsonpCallbackAllStar2015 = function( data ) {
                    cachedResponse = data;
                    deferred.resolve( data );
                }

            }

            return deferred.promise;

        };

        return pub;

    }
]);

Теперь внутри вашего контроллера вы можете сделать это:

app.controller('someController', [ 'eventsFactory', 
    function( eventsFactory) {

        eventsFactory.getEvent().then(function( data ) {
            console.log( data );
        });

    }
]);
person jeff    schedule 27.02.2015