我有一个应用程序,我希望使用.getJSON()
从API获取数据并将其存储在数组中,但我不希望继续使用代码,直到数组完全加载,所以我我已经调用了.done()
方法,但我的代码在完全定义之前继续向前推进,导致未定义的错误。以下是相关代码:
var similarList = getSimilar(randArtist, year);
similarList.done(function(item){
for (var j=0, len=similarList.length; j<len; j++){
similarArtistDict[similarList[j].name] =
similarArtistDict[similarList[j].name] || true;
}
getSimilar
函数应该返回一个列表,从而定义变量similarList。相反,尽管我已完成调用,代码仍直接移动到for循环,导致循环尝试获取similarList.length
时出现异常。
编辑第2部分:我的getSimilar方法的精简版本供参考。我意识到函数本身没有返回任何东西,所以我试图返回AJAX调用本身 - 它没有返回数组。我怎么能调整这个函数来返回数组data.artists?:
function getSimilar(name, year){
$.getJSON(ECHONEST_SIMILAR_URI, {
api_key: ECHONEST_KEY,
name: name,
artist_start_year_before: year,
results: '5'
}, function(response){
var data = response.response;
console.log(data);
console.log(data.artists);
return data.artists;
} ); }
答案 0 :(得分:1)
我想我可以猜到你哪里出错了。
我假设您的getSimilar
函数看起来像
function getSimilar(a,b){
var arr;
$.get("test.php").done(function(val) {
arr = val;
});
return arr;
}
如果是这样,你就忘记了AJAX意味着Asynchonous。 您希望在请求完成后执行回调函数以执行。
尝试这样的事情。
function getSimilar(a,b){
$.get("test.php").done(function(val) {
GetListCallback(val);
});
}
function GetListCallback(val){
for (var j=0, len=similarList.length; j<len; j++){
similarArtistDict[similarList[j].name] = similarArtistDict[similarList[j].name] || true;
}
答案 1 :(得分:1)
您无法从getSimilar
函数返回该数组,因为它是异步获取的,并且在函数返回时尚不可用。但是,您可以返回对asynchronous-jax调用结果的承诺,并pipe它将导致数组(在最近版本的jQuery中它是then
方法):
getSimilar(randArtist, year).done(function(similarList) {
for (var j=0, len=similarList.length; j<len; j++) {
similarArtistDict[similarList[j].name] = similarArtistDict[similarList[j].name] || true;
}
});
function getSimilar(name, year){
return $.getJSON(ECHONEST_SIMILAR_URI, {
api_key: ECHONEST_KEY,
name: name,
artist_start_year_before: year,
results: '5'
}).then(function(response){
var data = response.response;
console.log(data);
console.log(data.artists);
return data.artists;
});
}