嵌套 $.getJSON 的范围问题

Posted

技术标签:

【中文标题】嵌套 $.getJSON 的范围问题【英文标题】:Scope problem with nested $.getJSON 【发布时间】:2010-11-08 18:40:05 【问题描述】:

$.getJSON('http://twitter.com/followers/ids.json?screen_name=/…'+ query1 + '&callback=?',
  function(data) 
    alert('JSON data string 1 is: '+data); 
    $.getJSON('http://twitter.com/followers/ids.json?screen_name=/…'+ query2 + '&callback=?', 
      function(data1) 
        alert('JSON data string 2 is: '+data1); 
        f2=data1; 
        f1=data; 
        for(var i=0; i "less than" f1.length; i++)
        
          for(var j=0; j "less than" f2.length; i++)
          
            if (f1[i] == f2[j])
            
              common[c]=f1[i];
              c+=1;
            
          
        
        $('#content').append(''+common.length+'');//this line is not working though....... 
    );
);

在这一行

$('#content').append(''+common.length+'');

实际上页面挂起时不显示输出

任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

不要嵌套调用。您还可以避免一些内存问题,其中 javascript 为每个匿名函数维护所有局部变量的副本。通过分别进行这两个调用,您还可以同时执行这两个调用,而不是依次执行。

如果我了解您的目的,这是一个更好的方法。此外,通过轮询 gotA 和 gotB,您甚至可以为用户制作一个不错的“等待 A,等待 B”通知。

编辑:从上一个答案中添加了 for 循环修复。

var gotA, gotB;
var followingA, followingB;
function getCommonFollowers(user1, user2)

    gotA = false;
    gotB = false;
    jQuery.getJSON('http://twitter.com/followers/ids.json?screen_name=/…'+ user1 + '&callback=?', gotFollowersOfA );
    jQuery.getJSON('http://twitter.com/followers/ids.json?screen_name=/…'+ user2 + '&callback=?', gotFollowerOfB );

function gotFollowersOfA(data)

    followingA = data;
    gotA = true;
    if (gotB) 
        compareFollowersAB();
    

function gotFollowersOfB(data)

    followingB = data;
    gotB = true;
    if (gotA) 
        compareFollowersAB();
    

function compareFollowersAB()

    f2=followingA; 
    f1=followingB; 
    for(var i=0; i < f1.length; i++) 
        for(var j=0; j < f2.length; j++) 
            if (f1[i] == f2[j]) 
                //console.log("Adding f1[i]");
                common.push(f1[i]);
            
        
    
    $('#content').append(''+common.length+'');

【讨论】:

非常感谢......这是解决问题的好方法......使用标志......非常好:)..【参考方案2】:

您的第二个 for 循环递增 i 而不是 j。

您没有声明任何可能导致范围问题等的变量。

您能粘贴您的实际代码吗?希望任何人都可以在没有您的脚本的情况下诊断问题,这是一个艰难的要求。

您还可以在 jsbin.com 或 pastebin.me 上创建问题演示。

【讨论】:

【参考方案3】:

您绝对应该使用Great Turtle 的建议,但既然我已经尝试过了,这里是您的代码的修改版本,它确实有效:

        var query1 = 'user1';
        var query2 = 'user2';
        var data;
        var data1; 
        var f1;
        var f2;
        var common = [];
        var c = 0;
        
        $(document).ready(function() 
            $.getJSON('http://twitter.com/followers/ids.json?screen_name=' + query1 + '&callback=?', 
                function(data)  
                console.log('JSON data string 1 is: ' + data); 
                $.getJSON('http://twitter.com/followers/ids.json?screen_name=' + query2 + '&callback=?', 
                    function(data1)  
                    console.log('JSON data string 2 is: ' + data1); 
                    f2=data1; 
                    f1=data; 
                    for(var i=0; i < f1.length; i++) 
                        for(var j=0; j < f2.length; j++) 
                            if (f1[i] == f2[j]) 
                                //console.log("Adding f1[i]");
                                common.push(f1[i]);
                            
                        
                    
                    $('#content').append(''+common.length+'');
                ); 
            );
        );

主要解决方法是您的第二个 for 循环,如前所述,使用 i++ 而不是 j++,因此您的循环变得疯狂。

请注意,我已将您的警报调用更改为 console.log,因此请确保您使用的是安装了 Firebug 的 Firefox,或者只需再次将 console.log 替换为您的警报。

【讨论】:

我不是特别喜欢这个答案,因为两个 json 请求是同步发出的,并且考虑到这也是活动中最耗时的部分,它应该尽快并行执行。【参考方案4】:

不应该是 'http://' 吗?

$.getJSON('http://twitter.com...'

【讨论】:

【参考方案5】:

在 json 函数之外声明公共变量。

【讨论】:

以上是关于嵌套 $.getJSON 的范围问题的主要内容,如果未能解决你的问题,请参考以下文章

$.getJSON 函数期间设置的变量只能在函数内访问

jQuery .getJSON 返回到数组变量和 json 数组操作

从 Reddit 的 API 中检索评论

为啥 $.getJSON 静默失败?

jQuery的getjson问题 用getjson获取一个文本文件 代码和症状如下

jQuery:处理 getJSON() 中的错误?