下面我试图从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);
答案 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;
};