2014-07-16 8 views
0

JSON 배열 객체에서 일부 값을 추출하려고하는데 오류 메시지가 나타납니다. - 그들이 완료하여 카운터를 증가 할 때까지 기다린자바 스크립트 오류 : TypeError : str이 정의되지 않았습니다.

{ 
    "affiliates": [ 
     { 
      "affiliate_name": "a1", 
      "affiliate_id": "0" 
     }, 
     { 
      "affiliate_name": "a2", 
      "affiliate_id": "0" 
     }, 
     { 
      "affiliate_name": "a3", 
      "affiliate_id": "0" 
     } 
    ], 
    "status": "success" 
} 
+2

문제는 비동기 코드로 작업하고 있다는 것입니다. 각 반복 후에 요청이 완료되는 것은 아닙니다. – elclanrs

+5

이 코드에서'json'은 무엇입니까? – danronmoon

+1

''JSON 배열 객체 '는 무엇인가요? – Teemu

답변

0

을 나는이 작업을 할 수 있습니다 생각 :

var i=0; 
while(i<n){ 
    (function(j) { 
     $.get("counter.html").done(function (data2) { 
      var $html = $("<div>").html(data2); 
      var str = json.affiliates[j]; 
      $html.find("#coupon").html(str.affiliate_name); 
      $html.find("#coupon_id").html(str.affiliate_id); 
      $(".col-sm-4").append($html); 
     }); 
    })(i); 
    i++; 
} 
0

보다는 보장 된 마지막 주문 요청의 톤을 발사하거나 마무리 while 루프 : 여기

var i = 0; 
while (i < n) { 
    $.get("counter.html").done(function (data2) { 
     var $html = $("<div>").html(data2); 
     var str = json.affiliates[i]; 
     $html.find("#coupon").html(str.affiliate_name); 
     $html.find("#coupon_id").html(str.affiliate_id); 
     $(".col-sm-4").append($html); 
    }); 
    i++; 
} 

내 JSON입니다 필요한 경우 - 다시 전화 :

ajax(0); 
function ajax(i) { 
    $.get("counter.html").done(function(data2) { 
     var $html = $("<div>").html(data2); 
     var str = json.affiliates[i]; 
     $html.find("#coupon").html(str.affiliate_name); 
     $html.find("#coupon_id").html(str.affiliate_id); 
     $(".col-sm-4").append($html); 

     if (i < n) ajax(++i) 
    }); 
} 
+0

이것은 꽤 잘 동작 할 것이지만 서버에서 병렬 실행이 느슨한 것으로 생각합니다. 이는 인터넷과 같은 잠재적 네트워크에서 바람직합니다. 완료하는 데 상당한 시간이 걸릴 수 있습니다. – pid

0

i가 적절하게 인수 분해되지 않았습니다.

var i = 0; 

while (i < n) 
{ 
    (function (index) { // outer closure to factor "i" 

     $.get("counter.html").done(
      function(response_data) { 
       var $html = $("<div>").html(response_data); 
       var str = json.affiliates[index]; 
       $html.find("#coupon").html(str.affiliate_name); 
       $html.find("#coupon_id").html(str.affiliate_id); 
       $(".col-sm-4").append($html); 
      } 
     ); 

    }(i)); // closure 

    i++; 
} 
+0

들여 쓰기와 구문을 조금 수정했으나 여전히 의미가 없습니다. –

+0

맞습니다. 클로저와 비동기 코드를 뒤집 었습니다. 'done()'내부의 함수가 나중에 실행되기 때문에 클로저는 바깥에 있거나 그렇지 않아야합니다. – pid

0

여기 JSON 무엇에서 지정할하세요, 그리고 당신이 전화 때문에

(function(i){ 
$.get("counter.html").done(function(data2) { 
    var $html = $("<div>").html(data2); 
    var str = json.affiliates[i]; 
    $html.find("#coupon").html(str.affiliate_name); 
    $html.find("#coupon_id").html(str.affiliate_id); 
    $(".col-sm-4").append($html); 
    }); 
    i++; 
})(i) 

같은 함수에있는 동안 루프의 내용을 캡슐화 경우에 저에 따라 더 나은 것 : 클로저를 사용 비동기 적으로 엉망인 출력을 낼 수 있습니다.

관련 문제