2012-02-29 18 views
3

ループ内で複数のAJAXリクエストを作成しています。それが実行される最初の時間は、私はAJAX要求を発射し、戻って見ることができますが、process_json()が呼び出されるとき、それはundefinedをログに記録します。jQuery遅延AJAX呼び出し:可能な範囲の問題

// set defaults 
var app_id = 'xxx'; 
var secret = 'yyy'; 
var auth_token = 'zzz'; 

// list of items to call in the API 
var insights_to_check = ['application_permission_views_top_unique', 'application_installation_adds_unique', 'application_installation_removes_unique']; 
var json_responses = {}; 

var ajax_calls = []; 

// construct the API url 
for (var i in insights_to_check) { 
    var insight = insights_to_check[i]; 
    var url = 'https://graph.facebook.com/' + app_id + '/insights/' + insight + '?' + auth_token; 
    ajax_calls.push(get_json(url, insight)); 
} 

// when all ajax requests are done, call the process function 
$.when.apply($, ajax_calls).done(function(){ 
    process_json(json_responses); 
}); 

// collect responses to the ajax request in a global object 
function get_json(url, insight) { 
    $.getJSON(url, function(json) { 
     json_responses[insight] = json; 
    }); 
} 

// show the global object 
function process_json(all_json) { 
    console.log(all_json); 
} 

コードは、奇妙な問題があります。ここに私のコードはそのためです。手動で2回目に呼び出すと、期待どおりにJSONが返されます。

私の延期されたコールバックは、AJAXリクエストが完了する前に発砲しているようです。世界中のjson_responsesオブジェクトに応答を割り当てることができました。誰もがここで驚くほど明白な何かを見ることができますか?

答えて

2

(私はAjax呼び出し省略した場合it does not for me)それはundefinedをログに記録しますなぜ私はわからないが、あなたのコードの1つの問題は、.done()コールバックがajax_callsとしてすぐ配列で実行されていることです。問題を解決する可能性があります

function get_json(url, insight) { 
    return $.getJSON(url, function(json) { 
     json_responses[insight] = json; 
    }); 
} 

:あなたはget_jsonから$.getJSONの戻り値を返す必要が

+0

実際に動作しましたが、戻り値がなければ配列に何も追加されませんでした。ありがとうございました! –

関連する問題