0

xページにわたって1ページあたり50エントリを持つjsonファイルにアクセスしています。エントリの総数は 500 です。これは 10 ページに相当します。

ページ 1 の json ファイルからデータを取得し、データを配列に渡し、関数を繰り返しますが、今回はページ 2 です。

私は関数を作成し、各ページを完全にインクリメントしてフェッチしてループしますが、json データが解析されて配列に渡されるのを待たずに、再度ループします。

基本的に、データが処理されるまで待ってから続行したいと思います。

これまでの私のコードはおおよそ次のとおりです。

function getJsonData(metroID){
        currentPageNo = 0;
        totalPages = 'x';
        count = 0;

    function jsonLoop(){    
        meroAreaSearchString = 'http://jsonurl'+currentPageNo;

        $.getJSON(meroAreaSearchString,{},function( data ){ 
            if(totalPages == 'x'){
                var totalEntries = data.resultsPage.totalEntries;
                var perPage = data.resultsPage.perPage;
                totalPages = (totalEntries/perPage);
                log(totalEntries+', '+perPage+', '+totalPages);
                log(Math.round(totalPages));
            }
            $.each(data.resultsPage.results.event, function(i,item){
                var name = item.displayName;
                var type = item.type;
                var valueToPush = new Array();
                valueToPush[0] = name;
                valueToPush[1] = type;
                valueToPush[3] = count;
                locations.push(valueToPush);
                count++;    
            });
            });

            if(currentPageNo == totalPages){
                log(locations);
                alert('finished processing all results');
            }else{
                currentPageNo++;    
                jsonLoop();
            }
                currentPageNo++;    
                jsonLoop();
        }
 }
4

2 に答える 2

0

リクエストを同期させてみましたか?このコードを関数getJsonDataの先頭に置くだけです。

$.ajaxSetup({async:false});

同期Ajaxリクエストを取得するには、asyncオプションをfalseに指定できます。これにより、コールバックがデータを設定するまで関数が停止します。

于 2012-05-16T13:00:54.887 に答える
0

この$.getJSON()関数はAJAXリクエストを起動し、AJAX呼び出しが正常に解決されたときに、それが理にかなっている場合は、そのコールバック関数を呼び出します。

基本的に、これは、呼び出しが与えられると$.getJSON(url,data,callback);、jQueryがAJAX要求を起動してそれをurl渡し、その呼び出しが解決したときに呼び出すことを意味します。クリアカットは簡単です。datacallback

ここで見逃しているのは、AJAX呼び出しがまさにそれであるということです-その名前が示すように、その非同期です。これは、AJAX呼び出しの存続期間全体を通じて、アプリケーション内の他のロジックが終了するのを待たずに実行できることを意味します。

だからこのようなもの:

$.getJSON(url, data, callback);
alert('foo');

...おそらくalert()、AJAX呼び出しが完了する前に呼び出しが発生します。それが理にかなっていることを願っています。

AJAX呼び出しが完了した後に何かが発生することを確認するには、そのロジックをコールバック内に配置します。それが本当にコールバックの目的です。

$.getJSON(url, data, function (d) {

    something_you_want_done_after_ajax_call();

});

問題のコンテキストでは、の条件付きリコールをすべてjsonLoop()コールバックに入れる必要があります。インデントがあるため、現時点ではあまり明確ではありませんが、現在はコールバックの範囲外です。

于 2012-05-16T13:02:16.540 に答える