2011-12-05 29 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沒有在警報中顯示任何內容,它仍然可以很好地將內容傳遞給下一個例程,這就是我們要解決下一個問題的地方。