Работа с нумерацией страниц JSON в AngularJS

0

Я пытаюсь изучить 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);
  • 0
    Это время цикла определенно не делает то, что вы надеетесь. Будет запускать, вероятно, тысячи запросов. Это не будет ждать каждой итерации для запроса, который будет сделан. посмотрите на вкладке вашей сети
  • 1
    В любом случае, зачем вам больше 100 одновременно? Это очень много для просмотра пользователем, может делать запросы на большее, когда они нужны пользователю
Показать ещё 1 комментарий

1 ответ

0
Лучший ответ

Я получил его, как и предполагалось, используя приведенный ниже код.

       $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);
            })
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню