2012-11-14 2 views
1

나는 어떤 이유로 작동하지 않는 경우 다음 스크립트가 있습니다JSON 데이터는 다른 부분에 스크립트의 한 부분에서 일하고 있지만

success: function(widget_data) 
{ 

    if(widget_data.d[0]) { 

     var j = 0; 

     for (j = 0; j <= widget_data.d.length - 1; j++) { 

      $.getScript("js/" + widget_data.d[j].script, function() { 

       // this line is complaining about .widget_id 
       alert(widget_data.d[j].widget_id); 
      }); 

      // but this line works fine... 
      alert(widget_data.d[j].widget_id); 

     } 

    } 

} 

내가 한 withing에 .getScript으로, 다음 줄에 오류가 발생을 :

Cannot read property 'widget_id' of undefined 

그러나 이상한 것은, 후속이다

alert(widget_data.d[j].widget_id); 

오류 메시지는 알림이 제대로 작동하고 올바른 값을 반환합니다.

alert(widget_data.d[j].widget_id); 

내가 뭘 잘못하고 있니?

+0

html로 표시 할 수 있나요? widget_header_ 클래스입니까? – Adil

+0

그렇게하기 전에'.getScript' 내에서 경고를 시도했지만 작동을 멈 추면 같은 오류가 발생합니다. '.getScript'에서 알림을 이동하자마자 알림이 작동하기 시작합니다 ... – oshirowanen

답변

4

getScript 호출은 변수 j을 호출하는 것을 비동기 적으로 실행합니다. 호출 할 때 값이 아닙니다. 즉, j은 호출이 반환 될 때 루프를 종료하는 값을 가질 가능성이 높습니다. 함수 내에서 getScript으로 호출하여 참조가 아닌 j 값을 캡처 할 수 있습니다. 실제로 코드 샘플에서 볼 수 있듯이 실제로 "위젯"객체 자체를 캡처하는 것이 좋습니다.

success: function(widget_data) 
{ 

    if(widget_data.d[0]) { 

     var j = 0; 

     for (j = 0; j <= widget_data.d.length - 1; j++) { 

      getWidgetScript(widget_data.d[j]); 

      alert(widget_data.d[j].script); 

      // but this line works fine... 
      alert(widget_data.d[j].widget_id); 
      alert(widget_data.d[j].title); 

     } 

    } 

} 

function getWidgetScript(widget) { 
    $.getScript("js/" + widget.script, function() { 
     $(".widget_header_" + widget.widget_id).text(widget.title); 
    }); 
} 
+0

위젯이 사용되기 전에 스크립트가로드되도록 하시겠습니까? – oshirowanen

+0

@oshirowanen 위젯 객체는 각 함수 호출마다 다를 것입니다. 'widget_id'는 매개 변수로 제공된 위젯과 관련된 것입니다. 이전에는 getScript를 호출 할 때 비동기 호출이 리턴 한 값이 아닌'j' 값을 사용하려고 시도했습니다. 이 질문보기 : http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – tvanfosson

관련 문제