2

这使我疯狂。我无法用Firebug来完成它。有人能解释一下这里发生了什么吗?Javascript - 值存在,然后消失,然后再次出现?

基本上我有一个传入的文本文件,其中每行包含管道分隔的记录。我将它们分解为一个字符串数组数组,以便以后在自动完成文本框中使用。代码如下:

<script type="text/javascript"> 
$(function() { 

    var rawData = new Array(); 
    $.get("/sample.txt", 
     function (data) { 
      var raw = data.split('\n'); 
      for (var i = 0; i < raw.length; i++) { 
       rawData.push(raw[i].split('|')); 
      }; 
      alert(rawData); // 1st sanity check 
     } 
    ); 
    alert(rawData); // 2nd sanity check 
    alert(rawData); // 3rd sanity check 

由于某种原因,第一个完整性检查工作正常 - 它显示所有数据,如我所料。第二个显示rawData为空,但第三个显示所有数据。取消第一次完整性检查不会影响第二次和第三次。

这怎么可能?这是为什么?这真让我抓狂。

+0

这是weeeiird ... – 2011-06-09 02:12:07

回答

5

您忘记了get()函数是一个异步函数。您在里面定义的回调只会在文件加载后才会被调用。本质上,JavaScript解释器将其放入队列中,以便在动作完成时准备好,然后允许其余的代码执行。

因此,您在回调中的警报将反映文件已加载的事实。外部警报将在该文件加载之前执行。当然,等待解散第二次警报的时间越长,加载所有数据时第三次警报的更改就越好。

+0

让我困惑的一点是,第一个警报将首先触发(大概是异步函数),然后第二个警报用空值触发,然后第三个警报用一个值再次触发。对我来说,这是没有意义的,异步或其他。 – nathanchere 2011-06-09 03:05:32

+0

基本上,在第一次警报被调用的时候,数据已经被加载......并且我看不到第二次警报仍然没有数据,即使它正在用最初为空的rawData排队值,因为它肯定会出现在$ .get - 触发的警报之前,如果是这样的话? – nathanchere 2011-06-09 03:07:59

+0

这不是一个完全确定的答案,但它足以让我克服这个特殊的障碍 - 将原始数据相关的代码放在$ .get函数中就可以实现。谢谢! – nathanchere 2011-06-09 03:18:27

相关问题