Javascript 在AngularJS中处理JSON分页

Javascript 在AngularJS中处理JSON分页,javascript,json,angularjs,Javascript,Json,Angularjs,我正在努力学习Javascript和AngularJS。在这种情况下,我正在编写一个应用程序,它利用SpotifyWebAPI来读取和修改播放列表。我已经做了一个函数,可以根据播放列表的ID获取曲目,除了一件事之外,这个函数工作得很好。如Spotify Web API文档所述,请求限制为100条曲目。当然有一个URL来检索播放列表中接下来的100首曲目,但我还没有弄清楚如何正确处理这个问题。下面是我试图检索播放列表中的所有曲目,但这只会挂断浏览器 $scope.getPlaylistTracks

我正在努力学习Javascript和AngularJS。在这种情况下,我正在编写一个应用程序,它利用SpotifyWebAPI来读取和修改播放列表。我已经做了一个函数,可以根据播放列表的ID获取曲目,除了一件事之外,这个函数工作得很好。如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);
            })
        }

那个while循环肯定不是你所希望的。可能会发出数千个请求。它不会等待每次迭代都会发出请求。看看你的网络标签为什么你一次需要超过100个?这对用户来说是一个很大的挑战,当用户需要的时候,用户可以提出更多的请求。用户不需要查看曲目,应用程序需要。我的目的是在播放列表中检测(然后删除)重复的曲目,所以我想我需要获取所有这些曲目。