为什么这个变量返回一个空数组?

时间:2015-11-30 17:38:52

标签: javascript arrays nested soundcloud

下面我试图从SoundCloud中提取歌曲(基于我通过的一系列类型),将这些歌曲放入一个数组中,返回该数组,然后展平该数组(因为返回的数组是一个数组阵列)。

var genreArray = ['pop', 'hip-hop', 'alternative'];

var each = function (collection, callback) {
    if (Array.isArray(collection)) {
      for (var i=0; i<collection.length; i++) {
        callback(collection[i]);
      }
    } else {
      for (var key in collection) {
        callback(collection[key]);
      }
    }
};

var flatten = function (array) {
    var results = [];
    each (array, function(item) {
        if(Array.isArray(item)) {
            results = results.concat(flatten(item));
        } else {
            results.push(item);
        }
    })
    return results;
};

var getSongs = function (genreSelection) {
    var mySongArray = [];
    each (genreSelection, function (genre) { 
        SC.get('/tracks', { tags: genre }).then(function(tracks) {
            mySongArray.push(tracks);
        });
    });
    return mySongArray;
};

当我包含以下内容时,mySongs正确返回它应该的数组数组,但myFlattenedSongs返回一个空数组。这很奇怪,因为当我从我的代码中取出myFlattened首歌曲,然后进入控制台并手动插入它时,它会使数组阵列变得扁平化。关于这里可能出现什么问题的任何想法?

var mySongs = getSongs(genreArray);
var myFlattenedSongs = flatten(mySongs);

1 个答案:

答案 0 :(得分:0)

GetSongs正在推动ajax成功解析器中的轨道,这意味着在“then”函数执行之前会触发return语句。

var getSongs = function (genreSelection) {
    var mySongArray = [];
    each (genreSelection, function (genre) { 
        //This fires after the api fetches the data
        SC.get('/tracks', { tags: genre }).then(function(tracks) {
            mySongArray.push(tracks);
        });
    });

   // this fires before the api call
    return mySongArray;
};