通过x次调用获取所有JSON条目

时间:2012-05-16 12:52:51

标签: javascript jquery json pagination loops

我正在访问一个json文件,该文件在x页面数量上每页有50个条目。 我有条目总数,比如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();
        }
 }

2 个答案:

答案 0 :(得分:0)

您是否尝试过同步请求? 只需将这段代码放在函数getJsonData

的顶部即可
$.ajaxSetup({async:false});

您可以将async选项指定为false以获取同步Ajax请求。这将停止您的功能,直到回调设置一些数据。

答案 1 :(得分:0)

$.getJSON()函数触发AJAX请求,并在AJAX调用成功解析时调用它的回调函数,如果这有意义的话。

基本上,这只是意味着给定一个调用$.getJSON(url,data,callback);,jQuery会向url发送一个AJAX请求,同时传递data,并在调用时调用callback解析。明确切割直截了当。

你在这里缺少的是AJAX调用正如其名称所暗示的那样,它的异步。这意味着在AJAX调用的整个生命周期中,它允许应用程序中的其他逻辑运行,而不是等待它完成。

这样的事情:

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

...很可能会在您的AJAX调用完成之前导致alert()调用。我希望这是有道理的。

为确保在 AJAX调用完成后发生某些事情,您将该逻辑放在回调中。这就是回调的真正含义。

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

    something_you_want_done_after_ajax_call();

});

在您遇到问题的情况下,您只需将jsonLoop()的所有条件调用放入回调中。由于你的缩进,现在不是很明显,但它目前在你的回调之外。