2011-06-24 1 views
2

私はjsonの.eachループを使用して、あるクラスのページ上のすべての要素のjsonリクエストからリモートデータを取得します。要素の1つのセットは、liタグのグループであり、li要素がリモート情報で更新された後、別の機能を使用して並べ替えたいと思っています。項目は、JSONリクエストからのロード完了していないので、リストをソートしません.eachループの後にソート関数に渡すコールバックを実行する前に.each().getJSONリクエストが終了するのを待ちます。

。並べ替えが機能する場合私は、getJSONリクエストのコールバックとして.completeコールバックとしてソート関数を渡しますが、ソートは各項目ではなくリスト全体に対して1回だけ実行します。

fetch_remote_data(function(){sort_list_by_name();}); 

function fetch_remote_data(f){ 
jQuery('.fetching').each(function(){ 
    var oj = this; 
    var kind = this.getAttribute('data-kind'); 
    var url = "http://something.com" 
    jQuery.getJSON(url, function(json){ 
     $(oj).text(json[kind]); 
     $(oj).toggleClass('fetching'); 
    }); 
}); 
if (typeof f == 'function') f(); 
}; 

あなたはjQueryの1.5を使用している場合

答えて

5

、あなたはその$ .Deferred実装の利点を取ることができる:私はあなたの例では$('fetching')ビットは、実際のコードではないと仮定しています

function fetch_remote_data(f) { 
    var requests = [], 
     oj = this, 
     url = "http://something.com"; 

    $('fetching').each(function() { 
    var request = $.getJSON(url, function(json) { 
     $(oj).text(json['name']); 
     $(oj).toggleClass('fetching'); 
    }); 

    requests.push(request); 
    }); 

    if (typeof f === 'function') 
    $.when(requests).done(f); 
} 

// No need to wrap this in another function. 
fetch_remote_data(sort_list_by_name); 

?そのセレクタはDOM内の<fetching>要素を検索しています。これはおそらくあなたが望むものではありません。

+0

jqueryの長期的な変更の1つ。 +1 –

+0

私のコードにtypoがあったことに気付きました。$( '。fetching')でなければなりません。私はクラスを持つすべての要素のDOMを検索しています。次に、リモート要求を行い、その要素のテキストを置き換えます。 – Joey

0

each()を起動する前に実行するフェッチの総数を取得してください。 .completeコールバックを添付するよりも、完了した要求の数を最初に増やし、完了した数が実行される総数に等しい場合にのみソートするようにしてください。原則として、呼び出されるすべてのAjaxが終了した後でのみソートを実行する必要があります。K

関連する問題