Я пытаюсь изучить Javascript и AngularJS. В этом контексте я пишу приложение, использующее Spotify Web API для чтения и изменения плейлистов. Я создал функцию, которая извлекает треки в списке воспроизведения на основе его идентификатора, и это работает отлично, за исключением одного. Как указано в документации Spotify Web API, предел запроса составляет 100 треков. Конечно, есть URL-адрес для извлечения следующих 100 треков в списке воспроизведения, но я не понял, как правильно это обработать. Ниже приведена моя попытка восстановить все треки в списке воспроизведения, но это просто повесит браузер.
$scope.getPlaylistTracks = function (playlist_id) {
return $q(function (resolve, reject) {
Spotify.getPlaylistTracks($scope.currentUser["id"], playlist_id).then(function(data) {
console.log(data);
var tracks = data.items;
var next = data.next;
while(next != null) {
console.log("More than one page");
console.log(data.next);
$http.get(data.next, {
headers: {'Authorization': "Bearer " + $scope.token}
}).then(function(response) {
console.log(response.status);
console.log(response.data);
next = data.next;
tracks.push.apply(tracks, response.data.items);
}, function(response) {
console.log(response.data || "Request failed");
console.log(response.status);
})
}
resolve(tracks);
}, function(reason) {
reject(reason);
})
});
}
Если я сделаю это так, я смогу извлечь не более 200 треков:
var tracks = data.items;
if(data.next != null) {
console.log("More than one page");
console.log(data.next);
$http.get(data.next, {
headers: {'Authorization': "Bearer " + $scope.token}
}).then(function(response) {
console.log(response.status);
console.log(response.data);
tracks.push.apply(tracks, response.data.items);
}, function(response) {
console.log(response.data || "Request failed");
console.log(response.status);
})
}
resolve(tracks);
Я получил его, как и предполагалось, используя приведенный ниже код.
$scope.fetchTracksFromPlaylist = function (playlist_id) {
$scope.fetchPlaylistTracks(playlist_id).then(function(data) {
$scope.setPlaylistTracks(data);
})
}
$scope.fetchPlaylistTracks = function (playlist_id) {
$scope.tracks = [];
return $q(function (resolve, reject) {
Spotify.getPlaylistTracks($scope.currentUser["id"], playlist_id).then(
function (data) {
resolve(data);
}, function (reason) {
reject(reason);
})
});
}
$scope.setPlaylistTracks = function (tracks) {
$scope.tracks.push.apply($scope.tracks, tracks.items);
if (tracks.next) {
$scope.callSpotify(tracks.next, function(data) {
$scope.setPlaylistTracks(data);
});
}
}
$scope.callSpotify = function (url, callback) {
$http.get(url, {
headers: {'Authorization': "Bearer " + $scope.token}
}).then(function (response) {
callback(response.data);
}, function (response) {
console.log(response.data || "Request failed");
console.log(response.status);
})
}