Angular 带有自定义回调的服务 JSONP 请求
Angular Service JSONP Request with Custom Callback
我正在从具有自定义回调函数的 JSONP 提要中提取数据,for example:
jsonpCallbackAllStar2015({
"events": [
{
"title": "XYZ"
}
...
]
})
我可以这样做,使用 solution posted here 像这样:
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 错误,我猜这是因为服务 return 不够快:
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 请求? Here is a fiddle.
虽然这不是一个完美的解决方案,但它应该适合您。我添加了一些非常基本的缓存。我没有在 angular 中使用 jsonp,似乎在 $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 );
});
}
]);
我正在从具有自定义回调函数的 JSONP 提要中提取数据,for example:
jsonpCallbackAllStar2015({
"events": [
{
"title": "XYZ"
}
...
]
})
我可以这样做,使用 solution posted here 像这样:
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 错误,我猜这是因为服务 return 不够快:
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 请求? Here is a fiddle.
虽然这不是一个完美的解决方案,但它应该适合您。我添加了一些非常基本的缓存。我没有在 angular 中使用 jsonp,似乎在 $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 );
});
}
]);