我使用.done()错吗?

时间:2013-02-06 23:08:48

标签: javascript jquery ajax

我有一个应用程序,我希望使用.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;
    } ); }

2 个答案:

答案 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;
    });
}