2016-08-21 83 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或該方法的變體。如果您需要幫助,我會建議提出一個新問題。