2012-04-19 48 views
1

基于Chrome开发人员工具的一个断点,我想我正在处理一个范围问题,我可以弄清楚。这是我定义函数的方式吗?下面的脚本是一个包含js文件和我希望可用于其他函数的数组'timeStamp,而不必每次都调用loadData函数。javascript以外的范围

timeStamp数组一旦离开for循环,甚至离开函数,它就会变成undefined。

var timeStamp = []; // Want this array to be global 

function loadData (url){ 

     $.getJSON(url, function(json) { 

      for (var i=0;i<json.length;i++){ 
        timeStamp.push(json[i].TimeStamp); 
       } 
        console.log(inputBITS); //returns the value 
      }); 
     console.log(inputBITS); //undefined 
     } 

感谢您anyhelp

回答

6

它看起来像问题是,getJSON是异步的。当它执行并完成并且代码继续运行时,它仅指示联网操作的开始以检索数据。实际的网络操作直到一段时间才会完成。

完成后,会调用成功处理程序(指定为您的getJSON()调用的第二个参数),然后填充timeStamp数组。仅在调用成功处理程序之后,timeStamp数组才有效。

因此,您不能在代码中使用timeStamp阵列,该代码紧随getJSON()调用(尚未填充)。如果其他代码需要timeStamp数组,则应该从成功处理程序调用该代码或使用其他一些计时机制来确保使用timeStamp数组的代码在尝试成功处理程序之后才会尝试使用它,并且timeStamp数组已填充。

有可能使一些Ajax调用是同步的而不是异步的,但这通常是一个非常糟糕的主意,因为它在整个网络操作过程中锁定浏览器,这对观众来说非常不友好。修复编码逻辑以适应异步网络要好得多。

为Ajax调用像这样的典型设计模式如下:

function loadData (url){ 

    $.getJSON(url, function(json) { 
     // this will execute AFTER the ajax networking finishes 
     var timeStamp = []; 
     for (var i=0;i<json.length;i++) { 
       timeStamp.push(json[i].TimeStamp); 
     } 
     console.log(timeStamp); 
     // now call other functions that need timeStamp data 
     myOtherFunc(timeStamp); 
    }); 
    // this will execute when the ajax networking has just been started 
    // 
    // timeStamp data is NOT valid here because 
    // the ajax call has not yet completed 
    // You can only use the ajax data inside the success handler function 
    // or in any functions that you call from there 
} 
+0

谢谢你的解释。去检查成功处理程序。 – rd42 2012-04-19 21:30:50

+1

@ rd42 - 你已经有一个成功处理程序。这是匿名函数,它被声明为getJSON调用的第二个参数。这是在ajax调用成功完成时调用的函数。它在ajax网络完成后的某段时间被调用。 – jfriend00 2012-04-19 21:36:40

+0

我有点困惑。两个console.logs()都在函数中,但只有一个被定义,第二个console.log()在加载数组之前不会被调用,对吧? – rd42 2012-04-19 21:38:16

2

而这里的其他人谁不懂得基本的AJAX ...

getJSON异步。意思是,代码在函数调用之后和成功返回JSON请求之前保持运行。

您可以通过强制的要求是同步有相应的标志“修理”这一点,但是这是有很多原因(其中最重要的一个非常糟糕的想法是,你违反了一个 的基本思路JAX)。最好的方法是记住AJAX是如何工作的,而不是把AJAX返回时应该执行的所有代码放在正确的位置。

+0

谢谢。除了“正确的地方”,我还可以谷歌吗? – rd42 2012-04-19 21:28:27

+1

只需将它放在您定义的匿名函数中,您可以在其中看到正在记录的变量的正确值。 – 2012-04-19 21:29:05