2016-08-21 68 views
0

我正在尝试一些angularjs的东西。所以我有几个数组。其中之一是艺术家。这是它的基本结构由console.log(artists);Javascript数组元素undefined

artists

问题是,我不能单独访问数组中的元素。我读了很多关于关联数组的东西,并且可能会在SO上提出问题,但没有一个真正起到帮助作用。所以要么是我犯的一个非常愚蠢的错误,要么是其他的一些错误。

这里有几个结果,我得到了我拥有的每一个数组。

console.log(artists[0]); //returns undefined 
console.log(artists['0']); //returns undefined 
console.log(artists.length); // returns 0 in spite of the fact it showed 20 previously 
console.log(Array.isArray(artists)); //returns true 

是的,我创建了一个服务这样的阵列,将ChartService

var artists = []; 
var artistids = []; 
var tracks = []; 

$http.get('https://api.spotify.com/v1/search/?q=genre:pop&type=artist').success(function (data) { 
     var items = data.artists.items; 
     items.forEach(function(item){ 
      artists.push(item.name); 
      artistids.push(item.id); 
      var query = trackApi+item.id+'/top-tracks?country=SE' 

      $http.get(query).success(function (response) { 
       tracks.push({'preview': response.tracks[0].preview_url}); 

      }); 
     }); 


}); 

return { 
    Artists : artists, 
    Tracks : tracks 
    } 

我的控制器

console.log(ChartService.Artists); //runs fine 
console.log(ChartService.Tracks); //runs fine 

$scope.tracks = ChartService.Tracks; 

console.log($scope.tracks); //runs fine 
console.log($scope.tracks[0]); //returns undefined 
console.log($scope.tracks['0']); //returns undefined 
console.log($scope.tracks.length); // returns 0 in spite of the fact it showed 20 previously 
console.log(Array.isArray($scope.tracks)); //returns true 
+0

那么,你会迷惑吗?有很多情况下,数组可以保持空。您的http请求可能会失败,或者它不会返回任何项目。 –

+0

附加的图像显示控制台中的数组。它显然不是空的。 –

+0

我看到了图像。但是,在console.log(artists)后面立即调用'console.log(artists.length)'还不清楚吗? –

回答

0

的问题是,你发出前检查artists内容http get请求已经触发了他们的回应。以解决

一种方法是把你的代码在success回调,像这样:

$http.get('https://api.spotify.com/v1/search/?q=genre:pop&type=artist').success(function (data) { 
    var items = data.artists.items; 
    items.forEach(function(item){ 
     artists.push(item.name); 
     artistids.push(item.id); 
     var query = trackApi+item.id+'/top-tracks?country=SE' 

     $http.get(query).success(function (response) { 
      tracks.push({'preview': response.tracks[0].preview_url}); 
     }); 
    }); 
    // here 
    console.log(artists); 
}); 

不过,这解决了它artists,但随后你需要做的,如果你需要类似的东西在tracks:你有一个以上的请求而提供的是,你需要检查tracks数组的长度且仅当它具有完整的长度,这样的:

$http.get('https://api.spotify.com/v1/search/?q=genre:pop&type=artist').success(function (data) { 
    var items = data.artists.items; 
    items.forEach(function(item){ 
     artists.push(item.name); 
     artistids.push(item.id); 
     var query = trackApi+item.id+'/top-tracks?country=SE' 

     $http.get(query).success(function (response) { 
      tracks.push({'preview': response.tracks[0].preview_url}); 
      if (tracks.length == items.length) { // all done 
       console.log(artists, tracks); 
      } 
     }); 
    }); 
}); 

在后续曲estion(在评论中)你解释了你在你的控制器中需要这个。您可以查看$watch或该方法的变体。如果您需要帮助,我会建议提出一个新问题。