Javascript问题中的变量范围

时间:2009-07-07 14:07:21

标签: javascript arrays json twitter scope


var query1 = urlencode($('input[name="searchTerm1"]').val()); //user1
var query2 = urlencode($('input[name="searchTerm2"]').val()); //user1
var rpp = 20; //number of tweets to retrieve out
var c=0;
var f1=new Array();
var f2=new Array();
var common=new Array();
$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query1 + '&callback=?', 
        function(data) {
                                 f1=data;

            $('#content').append('p'+f1[0]+'p');//this one is coming
            });
$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query2 + '&callback=?', 
        function(data1) {
                                  f2=data1;
                });
$('#content').append('p'+f1[0]+'p');//this one is not coming...its showing Undefined
})

在这段代码中,如果你看得清楚,我已经确定使用了//两个附加语句

其中一个正在工作并输出数组中的数字

但另一个正在输出Undefined

我已经定义了数组,所以它应该取值,但实际发生的是数组在$ .getJSON函数之外变得不可访问。

任何帮助将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:1)

@anand,$ .getJSON()以异步方式检索JSON数据。回调函数的目的是在从异步请求接收到JSON后执行工作。我会简化你的例子:

var query1 = urlencode($('input[name="searchTerm1"]').val()); //user1
var query2 = urlencode($('input[name="searchTerm2"]').val()); //user1
var rpp = 20; //number of tweets to retrieve out
var c=0;
var f1=new Array();
var f2=new Array();
var common=new Array();

$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query1 + '&callback=?', 
    // 1st callback
    function(data) {
        f1=data;

        // We know that f1 has been assigned, so unless the Twitter API
        // returns an empty Array, f1[0] will not be Undefined.
        $('#content').append('p'+f1[0]+'p');//this one is coming
});
$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query2 + '&callback=?', 
    // 2nd callback
    function(data1) {
        f2=data1;
});

// This statement may be executed before 1st callback and therefore
// f1 may still be an empty Array causing f1[0] to return Undefined.
$('#content').append('p'+f1[0]+'p');//this one is not coming...its showing Undefined

请查看有关您追加电话的评论()。希望这有帮助!

答案 1 :(得分:0)

您需要在回调函数中追加您的值。现在,两个$ .getJSON调用之后的代码行在JSON完成下载之前触发。这就是第一个附加功能正在发挥作用的原因。你有时间问题。

为了说明时间,请使用这样的警告信息......

$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query1 + '&callback=?', function(data) {
    f1=data;
    alert('Two');
    $('#content').append('p'+f1[0]+'p');//this one is coming                
});

$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query2 + '&callback=?', function(data1) {
    f2=data1;
    alert('Three');
});

alert('One');
$('#content').append('p'+f1[0]+'p');//this one is not coming...its showing Undefined

答案 2 :(得分:0)

你永远不会引用f2,所以你可能有一个复制/粘贴错误。你的意思是再次引用f1吗?

顺便说一句,最好像这样初始化数组

var f1=[];
var f2=[];
var common=[];

而不是使用“new Array”。

此外,正如Josh所指出的,Ajax调用是异步的。在进入之前,您不希望依赖数据。

你的$ getJSON调用会立即回来,所以你的程序流程并不像你期望的那样。

jQuery's $getJSON将回调函数作为其第三个参数。您希望在通话后设置一个进行任何处理。

当你使用Ajax编程时,你没有一大块JavaScript,你有一堆事件驱动的代码。