-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 を定義します。代わりに、呼び出しが完了したにもかかわらず、コードは for ループに直接移動し、ループが を取得しようとすると例外が発生しますsimilarList.length

EDIT PART 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が非同期でフェッチされ、関数が返されたときにまだ使用できないためです。ただし、非同期 jax 呼び出しの結果の promise を返し、それをパイプして結果を配列にすることができます (最近のバージョンの 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 に答える
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 に答える