0

这里发生了什么事。我希望从 Twitter 上的多个列表中存储一些数据。每个请求最多返回 20 个数组,因此如果列表有超过 20 个成员,您必须执行多个请求(使用 cursor 属性获取下一个)。所以我想:无限循环调用和解析json.

基本上我想做的是:调用第一个json(光标值设置为-1)并存储数据。然后调用第二个json(光标值 = 到上一个的 next_cursor_str 值json)。然后调用第三个......等等,如果 next_cursor_str 值 = 0 则停止循环(这意味着它是最后一个json)。那是我的初稿:

var interval = setInterval(function(i){ /*start the loop*/
    if (i==1) {var cursor = '&cursor=-1'} else {var cursor = '&cursor='+json.next_cursor_str+''} /* set the value of cursor ine the request. The first request have to be cursor=-1*/
        var url='twitter-proxy.php?url='+encodeURIComponent('lists/members.json?owner_screen_name=flavienhamon&slug=lexpress&skip_status=true'+cursor+''); /*Make the request*/
            $.getJSON(url, function(json) { processData(json); /*store data for processing*/ console.log(json); 



    if (json.next_cursor_str == 0) {window.clearInterval(interval);}; /*stop the loop if*/
            });   
},5000); /*end of loop fonction*/       

无限循环工作,有停止事件。但是我不能将第一个被调用的 json 设置为“cursor=-1”,并且'&cursor='+json.next_cursor_str+''由于 json 尚未定义,因此它不起作用。

所以我做了一些改变:

var url='twitter-proxy.php?url='+encodeURIComponent('lists/members.json?owner_screen_name=flavienhamon&slug=lexpress&skip_status=true&cursor=-1'); /*call manually the first json*/
  $.getJSON(url, function(json) { processData(json); console.log(json); NombreCompteJ1 = json.users.length;
    var interval = setInterval(function(i){ /*start the loop*/
            var url='twitter-proxy.php?url='+encodeURIComponent('lists/members.json?owner_screen_name=flavienhamon&slug=lexpress&skip_status=true&cursor='+json.next_cursor_str+''); /*Make the request*/
                $.getJSON(url, function(json) { processData(json); /*store data for processing*/ console.log(json); 



        if (json.next_cursor_str == 0) {window.clearInterval(interval);}; /*stop the loop if*/
                });   
    },5000); /*end of loop fonction*/       

});     

这一次,第一个 json 是 call 和 proccess 没有问题。然后循环开始调用第二个json,处理它,然后......再次调用第二个。

控制台捕获:http: //img811.imageshack.us/img811/223/infiniteloop.png

&cursor='+json.next_cursor_str+'一次又一次地调用第一个 json 的 next_cursor_str 值,而不是调用循环的前一个元素的值。

有人可以解释如何解决这个问题吗?两天以来我一直在学习 jQuery 和 JS,我读了很多书,但我在这方面找不到任何东西。我可以用手来学习!

4

1 回答 1

1

使用setTimeout()而不是setInterval(),因此您可以每次都使用更新的游标传递闭包。并将您的代码定义为命名函数,以便您可以在setTimeout().

function getData(cursor) {
    var url='twitter-proxy.php?url='+encodeURIComponent('lists/members.json?owner_screen_name=flavienhamon&slug=lexpress&skip_status=true&cursor='+cursor);
    $.getJSON(url, function(json) {
        processData(json);
        console.log(json);
        var next_cursor = json.next_cursor_str;
        if (next_cursor != 0) {
            setTimeout(function() { getData(next_cursor); }, 5000);
        }
    });
}

开始循环:

getData(-1);
于 2013-06-06T23:04:35.823 回答