2011-12-05 20 views
0

我的申请寻求: 1.填充某些阵列(使用JSON文件) 2.处理阵列数据之前... 3. ...在准备的DIV更斗争与异步JavaScript

插入处理的阵列的数据

目前,这是以程序方式构建的,但正如Pointy指出的那样(http://stackoverflow.com/questions/8377344/scope-of-javascript-array-differs-from-ie9-to-firefox-chrome/ 8377401#8377401),试图通过一些异步编程来实现。我目前的目标是让它在所有浏览器中正常工作,并使其正确异步。

尽管应用程序在IE9中正常工作,但在FF和Chrome中失败。在以下主要过程中,IE9填充并保留所有数组内容。 FF等人,然后填充然后失去它。

//globally declare some arrays (used throughout the application) 
function buildTree(id) { 
    $(document).ready(function() { 
     $.getJSON(JSONfile, function(data) { 
      $.each(data.person, function(i, xdata) { 
       //populate arrays with relevant data 
      }); //end of first $.each() 
      //check 1 
     }); //end of first getJSON 
     //check 2 
     $.getJSON(JSONfile, function(data) { 
      //check 3 
      $.each(data.person, function(i, xdata) { 
       //populate arrays with relevant data, using arrays from first read 
      }); //end of second $.each() 
      //check 4 
     }); //end of second getJSON 
     //check 5 
     //check 6 
    }); //end of document.ready 
} 

数组是罚款:检查1,3,4,6个 数组是空的检测2,5

要添加困惑我的痛苦,我决定只转储阵列到的DIV不处理。我意外地在(= check5)中留下了警报。虽然它仍然显示数组为空,但当下一行执行时(将数组转储到DIV中),一切都很好。注释掉警报:什么都没有了。

看到有什么明显的错误?

+0

数组在2和5中为空,因为这些位置属于ready处理程序。 Ajax响应处理程序(用于从就绪处理程序中创建的Ajax请求)在就绪处理程序之后执行一段时间*。 –

+0

尝试移动你的第二个“$”。getJSON()“调用你的”// check 1“注释所在的位置,也就是说,将整个代码块移到第一个”$ .getJSON()“的回调函数中*你可以把它放在一个named函数使代码更干净,如果你愿意,可以减少“indenty” – Pointy

+0

尖尖的,这似乎工作,但后来我注意到,我仍然有一个警告工作在填充DIVs的命令之前,当我评论出来时,什么都没有。我可能会对它进行不正确的格式化 - Dave提到这应该在成功函数中,也许我错过了一个逗号或者其他东西。 $ .each()... }); $ .getJSON()。 ( }); }); –

回答

1

您有几个选择。

  1. 在第一个函数的success函数中执行第二个JSON Ajax调用。 (“check 1”)
  2. 使用jQuery's .when/.then将它们堆叠起来。
  3. 做更多的工作服务器端,并避免做到这一切Ajaxy。
  4. 使它们同步(ew,不)。
0

您代码中的问题是,两个AJAX请求都会立即发送,并且没有什么能保证第一个会在第二个之前返回。

您可以通过

  1. aroung这个工作发送第一个是做了之后,第二AJAX请求

    $.getJSON(..., function(data1){ 
        $.getJSON(..., function(data2){ 
        }); 
    }); 
    
  2. 明确地考虑允许或者要求先来

    //I don't know if there is a function to do this kind of sync 
    // built-in jQuery already. In Dojo I'd use a DeferredList... 
    
    var requests_to_go = 2; 
    var args = []; 
    
    function onHaveAllData(args){ 
        var data1 = args[0]; 
        var data2 = args[1]; 
        //populate second array 
    } 
    
    $.getJSON(..., function(data){ 
        requests_to_go -= 1; 
        args[0] = data; 
        if(request_to_go <= 0){ onHaveAllData(args); } 
    }); 
    
    $.getJSON(..., function(data){ 
        requests_to_go -= 1; 
        args[1] = data; 
        if(request_to_go <= 0){ onHaveAllData(args); } 
    }); 
    
0

这是一个欺骗性的问题。是的,它确实有异步情况(需要更正),但真正的问题是:为什么我在FF的alert语句中看不到任何内容?目前,我并不在乎,因为即使FireFox没有在警报中显示任何内容,它仍然可以很好地将内容传递给下一个例程,这就是我们要解决下一个问题的地方。