2016-11-11 67 views
1

我很漂亮n00b與JS編程,所以這可能是一個愚蠢的問題,但經過幾個小時的搜索,我還沒有找到一個工作的解決方案。閱讀多個JSon記錄到一個數組

我有多個JSON訂閱源。服務器是給一個多層JSON創紀錄的網址是這樣的(數據是虛構的測試數據):

  • http://address/ci/c/1給出:

    { "LGICUS01OperationResponse": { "ca": { "ca_phone_mobile": "07799 123456", "ca_request_id": "01ICUS", "ca_return_code": 0, "ca_dob": "11.07.1950", "ca_last_name": "Pandy", "ca_num_policies": 0, "ca_phone_home": "01962 811234", "ca_email_address": "[email protected]", "ca_house_name": "", "ca_policy_data": "", "ca_customer_num": 1, "ca_first_name": "Andrew", "ca_house_num": "34", "ca_postcode": "PI101OO" } } }

  • http://address/ci/c/2給出:

    { "LGICUS01OperationResponse": { "ca": { "ca_phone_mobile": "123", "ca_request_id": "01ICUS", "ca_return_code": 0, "ca_dob": "30.09.1965", "ca_last_name": "Tracey", "ca_num_policies": 0, "ca_phone_home": "", "ca_email_address": "[email protected]", "ca_house_name": "Tracey Island", "ca_policy_data": "", "ca_customer_num": 2, "ca_first_name": "Scott", "ca_house_num": "", "ca_postcode": "TB14TV" } } }

等。現在我設法用ajax讀取JSON recors,但是我有嚴重的問題在getCurrentJson函數之外傳遞這些信息。最佳的情況是,所述第一兩個參數將被省略,以便不會有供以後操作的用戶信息的「標準方式」的陣列是這樣的:

{ 
    "rows":[ 
     {"ca_customer_num":1", "ca_first_name:"Andrew",...} 
     {"ca_customer_num":2", "ca_first_name:"Scott",...} 
    ... 
    ] 
} 

下面是代碼:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>JSON test</title> 
      <script src="jquery.js" type="text/javascript"></script>  
      <script> 
      var myjson = []; 
      for (i = 1; i < 11; i++) { 
       getCurrentJson(i); 
       console.log(myjson[i].LGICUS01OperationResponse.ca.ca_phone_mobile); 
      } 

      function getCurrentJson(current){ 
      $.ajax({ 
       dataType: "json", 
       url: "http://192.49.208.193:9081/ci/c/"+current, 
       success: function(data){ 
        myjson[current] = data; 
        console.log(myjson[current]); 
        console.log(myjson[current].LGICUS01OperationResponse.ca.ca_phone_mobile); 
       } 
       });  
      } 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

現在,ajax函數內部的console.log輸出顯示Object信息和「ca_phone_mobile」數字,但for循環中的第一個控制檯輸出顯示:「Uncaught TypeError:無法讀取undefined(...)的屬性'LGICUS01OperationResponse' 」。我是否需要一些toString數據類型轉換或類似的?我也嘗試將myjson數組傳遞給getCurrentJson函數,但沒有成功。

+0

'$ .ajax'執行異步調用。這就是爲什麼你for循環中的'console.log'沒有顯示預期的結果,異步請求還沒有完成。 –

回答

0

通知AJAX請求是異步

PS:以下部分示例(也注意到,並非所有的請求都獲得成功,有些人可能會失敗,從不done == total

var myjson = []; 
 
var total = 10; 
 
var done = 0; 
 

 
for (i = 1; i <= total; i++) { 
 
    getCurrentJson(i); 
 
    // at this point AJAX request haven't finished (most likely) 
 
    //console.log(myjson[i].LGICUS01OperationResponse.ca.ca_phone_mobile); 
 
} 
 

 
function allDone() { 
 
    console.log(myjson); 
 
} 
 

 
function getCurrentJson(current){ 
 
    $.ajax({ 
 
    dataType: "json", 
 
    url: "http://192.49.208.193:9081/ci/c/"+current, 
 
    success: function(data){ 
 
     myjson[current] = data; 
 
     done++; 
 
     console.log(myjson[current]); 
 
     console.log(myjson[current].LGICUS01OperationResponse.ca.ca_phone_mobile); 
 
     if (done == total) { 
 
     allDone(); 
 
     } 
 
    } 
 
    }); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

不錯,這似乎是工作! :)看來,訣竅不是嘗試與js同步ajax,而是讓ajax在準備就緒時進行自己的函數調用。 但是,問題是,只要有信息,我想閱讀c /「X」地址。服務器只會在讀取數據時返回空值,所以我可以做一個簡單的if(ca_last_name ==「」)「檢查而不是」(done == total)「,但由於異步ajax性質,我會需要在調用函數中有一些無限循環並以某種方式分解它。任何提示如何做到這一點?謝謝。:) – Sushukka

+0

是的,你必須循環,直到一個標誌被提出,這個標誌將被第一個請求標記,沒有'ca_last_name',正如你所說的。但請注意,您需要檢測所有啓動的請求何時全部完成。爲此,您應該處理'complete',因爲該回調是在請求結束時執行的(在執行'success'和'error'回調之後)「。然後,對於每個已啓動的請求,例如,在每個「完成」回調時增加「總數」,雖然不會停留在「done == total」上,但是您也可以增加「done」需要監視你的國旗 – arhak

0

Javascript是異步的,你必須等待響應。對於你得到你的Ajax響應request.So你應該使用async或處理回調之前現在

console.log(myjson[i].LGICUS01OperationResponse.ca.ca_phone_mobile); 

執行。

http://codepen.io/anon/pen/gLPJNe

+0

我假設在代碼片段「cb」需要寫「回調」。我試過了,但仍然出現錯誤: _demo_callback.html:11 Uncaught TypeError:無法讀取屬性'LGICUS01OperationResponse'undefined(...)_ – Sushukka