-1

我有一个应用程序,我想从 API 获取数据.getJSON()并将其存储在一个数组中,但我不想在数组完全加载之前继续使用代码,所以我调用了该.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。相反,尽管我调用了 done,但代码直接移动到 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;
    } ); }
4

2 回答 2

1

我想我可以猜到你哪里出错了。

我假设你的getSimilar功能看起来像

function getSimilar(a,b){
    var arr;
    $.get("test.php").done(function(val) {
        arr = val;
    });
    return arr;
}

如果是这样,您忘记了 AJAX 意味着异步。您希望在请求完成后执行回调函数。

试试这样的东西。

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;
}
于 2013-02-06T23:23:31.900 回答
1

您不能从getSimilar函数中返回数组,因为它是异步获取的,并且在函数返回时还不可用。但是,您可以返回异步 jax 调用结果的承诺,并将其通过管道传递到数组中(在最近的 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;
    });
}
于 2013-02-07T01:19:05.427 回答