2017-12-12 8 views
1

コールバック機能に問題があります。私のコードでは、REST APIに16個のGETリクエストを作成して16個のJSONファイルを取得することになっています。その後、これらのJSONのそれぞれをその週のサッカーテーブルランキングの辞書に解析し、最終的に過去16週間のリーグ順位を与えるために各エントリを「辞書の辞書」HistoricalTableに保存する必要があります。しかし、関連するコールバック関数を実行すると、さまざまなLeagueTable変数が正常に動作しているように見えますが、これをHistorical Dataに保存しようとすると、最終的な配列はそれぞれ同じように見えます。私のコールバック関数が配列に埋め込まれていないようですか?

Here is an image of the console output for my final table. Each entry should be different, whereas each entry seems to be the most recent week.

//This creates the modifier for the URL used in the GET request 
var MatchDayList = [] 
for (i = 0; i < 17; i++) { 
    MatchDayList[i] = i 
} 
MatchDayList.shift() 

var HistoricalTable = {} 
var LeagueTable = {} 

// This executes the GET request 
for (i = 0; i < 16; i++) { 
    url = 'http://api.football-data.org/v1/competitions/445/leagueTable/?matchday=' + MatchDayList[i], 

    $.ajax({ 
     url: 'http://api.football-data.org/v1/competitions/445/leagueTable/?matchday=' + MatchDayList[i], 
     headers: { 
     'X-Auth-Token': '' 
     }, 
     method: 'GET', 
     dataType: 'json', 
     success: function(data) { 
     handleData(data) 
     }, 

    }); 
} 
//This function should append the retrieved JSON to the LeagueTable variable 
function handleData(data) { 
    for (var j = 0; j < 20; j++) { 
    LeagueTable[data.standing[j].position] = data.standing[j].teamName 
    LeagueTable[20] = data.matchday 
    } 
    saveData(LeagueTable) 
} 
//This function should save each LeagueTable matchday data into a bigger array, HistoricalTable 
function saveData(LeagueTable) { 
    HistoricalTable[LeagueTable[20]] = LeagueTable 
    console.log(HistoricalTable) 
} 

答えて

0

あなたは全体のコード全体で単一LeagueTable変数を使用しています。したがって、handleDataを呼び出すたびに同じLeagueTableが入力され、saveDataにメインテーブルに格納されます。つまり、同じテーブルへの参照が16個になります。 、それがグローバルスコープで終わるので、ごurl変数がどこにも宣言されていない、サイドノートで

function handleData(data) { 
     var LeagueTable = {}; 
     for (var j = 0; j < 20; j++) { 
     LeagueTable[data.standing[j].position] = data.standing[j].teamName 
     LeagueTable[20] = data.matchday 
     } 
     saveData(LeagueTable) 
    } 

handleData関数内の変数の宣言を移動するのに十分である必要があり、それを解決するために、これは一般的に悪いことです。 forループ内のインデックスはiと同じです。

+0

これは素晴らしいです!私はこれを何時間も見つめていて、答えを見つけられませんでした。答える時間をとってくれてありがとう! –

関連する問題