2016-11-11 3 views
1

JS 프로그래밍과 함께 꽤 n00b이므로 바보 같은 질문 일지 모르지만 검색 시간이 지나면 그물에서 작동하는 해결책을 찾지 못했습니다.배열로 다중 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" } } }

  • 서버 (데이터가 가상의 테스트 데이터입니다)이 같은 URL 당 하나의 다층 JSON 기록을주고있다

등등. 이제는 Ajax로 JSON recor를 읽을 수있게되었지만 getCurrentJson 함수 외부에서 해당 정보 배열을 전달하는 데 심각한 문제가 있습니다.

<!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> 
: 여기

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

코드이다 : 최적의 상황은 먼저 두 개의 파라미터가 다음과 같이 "표준 방법"에 나중에 조작을위한 사용자 정보의 배열이 될 수 있도록 생략 될 것이라는 것

이제 ajax-function 내부의 console.log 출력은 Object 정보와 "ca_phone_mobile"번호를 출력하지만 for 루프의 첫 번째 콘솔 출력은 다음과 같습니다 : "Uncaught TypeError : 정의되지 않은 (...) 속성의 '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

니스,이게 효과가있는 것 같습니다! :) 트릭은 jax와 아약스를 동기화하려고 시도하는 것이 아니라 아약스가 준비가되었을 때 자체 함수 호출을하도록하는 것입니다. 그러나 문제는 정보가있는 한 c/"X"주소를 읽는 것입니다. 서버는 데이터를 읽을 때 비어있는 값을 반환하므로 간단하게 'if (ca_last_name == ")"대신 "(done == total)"확인을 할 수 있지만 비동기 아약스 자연 때문에 호출 함수에 무한 루프가 필요하고 어떻게 든 깨뜨릴 필요가 있습니다. 어떤 힌트를 어떻게해야합니까? 감사.:) – Sushukka

+0

예, 플래그가 올라올 때까지 반복해야합니다. 그런 플래그는 당신이 말한대로'ca_last_name'이없는 첫 번째 요청으로 표시됩니다. 그러나 시작한 요청이 모두 완료되면이를 감지해야합니다. 콜백은 요청이 끝날 때 ('success'와'error' 콜백이 실행 된 후) 호출 될 때'complete'를 처리해야합니다. " 그런 다음 실행 된 각 요청에 대해 '전체'콜백이 증가하는 동안 (예를 들어) '전체'를 늘리십시오. 'done == total'에서 멈추지는 않겠지 만'done '을 늘리십시오. 플래그를 모니터링해야합니다 – arhak

0

자바 스크립트가 비동기 응답을 기다려야합니다. 당신은 당신이 async를 사용하거나 콜백을 처리해야 request.So 당신의 아약스의 응답을 얻기 전에 지금

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

실행하십시오.

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

+0

코드 스 니펫에서 "cb"가 "콜백"을 작성해야한다고 가정합니다. 그랬지만 오류가 계속 발생했습니다 : _demo_callback.html : 11 Uncaught TypeError : 정의되지 않은 (...) _의 'LGICUS01OperationResponse'속성을 읽을 수 없습니다 – Sushukka