[英]Angular JSONP Factory call not working, however it does work in controller
我查看了與該問題相關的所有SO帖子,但仍然找不到答案。 這個回答看來是最有前途的,但我不明白答案,看來提出要求的人也沒有。
我想做什么? 向itunes API發出JSONP角度GET
請求。 當我從控制器發出GET
請求時,這種方法非常有效,但是當我嘗試重構時,為了遵循“關注分離”的原則,將請求移至工廠,並注入控制器,我遇到了麻煩。 我知道如果我在工廠中不使用JSONP調用,則仍在撥打電話,因為出現CORS錯誤。
這是工廠代碼:
var myApp = angular.module('jDillaApp', []).factory('Music', function ($http) {
var o = {
songs: []
};
o.getNextSongs = function () {
return $http.jsonp({
method: 'GET',
url: 'https://itunes.apple.com/search?term=j+dilla&limit=25?format=jsonp&callback=JSON_CALLBACK'
}).success(function (data) {
console.log(data)
});
}
return o
})
我的控制器如下所示:
myApp.controller('jDillaCtrl', ['$scope', '$http', 'Music',
function ($scope, $http, Music) {
Music.getNextSongs();
$scope.songs = Music.songs;
var media = new Audio();
$scope.playSong = function () {
media.pause();
var randomSong = Math.round(Math.random() * ($scope.songs.length - 1));
media = new Audio($scope.songs[randomSong]);
media.play();
}
}]);
就我所知,該錯誤不是很多幫助,但無論如何還是值得發布TypeError: h.replace is not a function
您的$http.jsonp
方法輸入錯誤是您的第一個問題, $http.jsonp
方法接受兩個參數,例如
$ http.jsonp(url,[config])url->要進行ajax配置的url->如果要在請求中進行其他更改,則可以從此處在
{}
鍵值對中傳遞這些設置可以設置headers
,type
等。
您的服務方法應該返回promise,因為您只需要返回已經具有promise的$http.jsonp
對象,而無需在此處創建額外的promise對象。
服務
o.getNextSongs = function () {
return $http.jsonp('https://itunes.apple.com/search?term=j+dilla&limit=25?format=jsonp&callback=JSON_CALLBACK')
}
在控制器中,呼叫將使用.success
和.error
解決,您也可以使用.then
控制者
Music.getNextSongs()
.success(function (data) {
//here you get the ajax success
console.log(data)
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.