【问题标题】:Scope problem with nested $.getJSON嵌套 $.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+'');

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: jquery twitter scope callback jsonp


    【解决方案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 函数之外声明公共变量。

        【讨论】:

          猜你喜欢
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          • 2012-02-16
          • 1970-01-01
          • 1970-01-01
          • 2022-01-16
          • 1970-01-01
          • 2020-11-18
          相关资源
          最近更新 更多