2012-11-30 6 views
1

JavaScript 문제에 대한 오해에 대한 약간의 문제가 있습니다.자바 스크립트 : 내부 함수에 의해 외부 함수의 변수가 변경되지 않았습니다.

는 I 코드의 조각이 - getStdOptions 내부 내부 함수 호출되지만 본질적

getStdOpts: function(tbl, filt) { 
    var vals = new Array(); 

    this.srvs.getStdOptions(
     { tbl: tbl }, 
     { 
      'ok': function(rsp) { 
       for (var i in rsp) { 
        vals.push({ value: rsp[i].id, text: rsp[i].descr }); 
       } 
      } 
     } 
    ); 
    return vals; 
} 

을 : 액세스 할 때 ('OK'기능 ...)를 발스 어레이에 새로운 값을 푸시 호출 외부에서 vals 배열이 비어 있습니다. 내부 함수 내에서 액세스 할 때 vals에는 예상대로 모든 요소가 포함됩니다.

정말이 문제에 관해 도움을 주시면 감사하겠습니다.

+1

'getStdOptions'는 일부 비동기 작업을 수행 중일 수 있습니다. 그렇지 않으면 실제로 콜백을 전달할 이유가 없습니다. 나는. 'val'은'ok' 함수가 실행되기 전에 반환됩니다. 더 잘 돕기 위해'this.srvs.getStdOptions'가 무엇을하는지 알 것입니다. –

+0

안녕하세요 펠릭스,'getStdOptions' 함수는 백 엔드 데이터 서비스를 호출하여 주어진 테이블'tbl'에서 옵션 목록을 검색합니다. 그리고 그 서비스의 응답 부분은 상태 _ok_와 옵션 목록이 될 것입니다. 아마도 서비스 검색 작업이 비동기적일 수 있다는 사실에 대해서는 생각하지 않았습니다. 나는 다시 코드를 가지고 놀고 내가 작동하는지 알릴 것이다. 당신의 도움을 주셔서 감사합니다! :) –

답변

1

이것은 클로저/범위 문제가 아닌지 의심 스럽습니다. this.srvs.getStdOptions이 비동기 작업이면 getStdOpts은 항상 빈 배열을 반환합니다. 이 배열은 작업이 완료되면 채워질 것입니다.이 배열은 서술 된대로 필요할 때마다 채워집니다. 조금 다르게 처리해야합니다. 어느 쪽이든 getStdOpts에 직접 호출하여 vals을 매개 변수로 사용하고 익명 호출 내에서 this.srvs.getStdOptions에 콜백을 실행하거나 약속을 콜백을 추가 할 수있는 객체로 반환해야합니다 (콜백을 추가 할 수 있음). 동일한 vals을 매개 변수로 사용하십시오. 익명 콜백에서 약속 한대로 vals을 "약속 한"결과로 처리해야합니다.

관련 문제