嵌套 $.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 的范围问题的主要内容,如果未能解决你的问题,请参考以下文章
jQuery .getJSON 返回到数组变量和 json 数组操作