0

我正在访问一个 json 文件,该文件每页有 50 个条目,超过 x 个页面。我有条目总数,比如 500 - 相当于 10 页。

我从 json 文件中获取第 1 页的数据,将数据传递给数组,然后重复该函数,但这次是第 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});

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

于 2012-05-16T13:00:54.887 回答
0

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

基本上,这只是意味着给定一个 call $.getJSON(url,data,callback);,jQuery 将触发一个 AJAX 请求以url传递data它,并callback在该调用解决时调用。清晰的直截了当。

您在这里缺少的是 AJAX 调用就是这样——顾名思义,它的asynchronous。这意味着在 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 回答