2012-03-06 3 views
0

제 코드에서 객체 메소드를 호출하고 콜백에서 데이터를 검색하여 다른 메소드 또는 함수에 전달해야합니다.javascript 객체 메소드 콜백에서 변수 가져 오기

someObject.getSomeData({option1:'value1', option2:'value2'}, 
    function(data) { 
     doAwesomeStuff(data); 
    } 
); 

그러나 콜백은 범위 밖에있는 함수/개체/변수를 인식하지 못합니다.

내가 지금 시도한 것은 기능을 둘러싼 모든 것을 정리하는 것입니다.

var myData = ''; 
(function(myData) { 
    someObject.getSomeData({option1:'value1', option2:'value2'}, 
     function(data) { 
      myData = data; 
     } 
    ); 
}); 
doAwesomeStuff(myData); 

그러나 작동하지 않습니다.

아무도 제대로 수행하는 방법을 알고 계십니까?

+1

"범위 밖"이라고 말하면서 어떤 변수를 언급합니까? – pimvdb

+1

> 그러나 콜백은 범위 밖에있는 > 함수/객체/변수를 인식하지 못합니다. 그건 약간 이상한데 ... doAwesomeStuff()는 어디에 정의 되었습니까? 전화가 걸려 오는 범위 (또는보다 넓은 범위)에 도달 할 수 있으면 도달 할 수 있어야합니다. – mamoo

+0

실제로 정의되고 실행되었지만 nodejs에 있었고 일부 데이터 처리를 수행하고 console.out 문이 실행 된 것을 확인하는 동안 다른 출력 사이에 손실 된 것으로 보입니다. 나는 서둘러 질문을 게시하는 것처럼 보였고, 나는 학교에서 그렇게했다. 나는 집에 도착하자 마자 그것을 알아 냈고, 그것에 대해 신선한 시각을 가지고 있었다. 덕분에 도움을 주신 모든 분들께서 삭제 또는 무언가를 위해 플래그를 지정하겠습니다. –

답변

3

당신은 정말 우리가 충분히에 거기에 가고 부여하지 않은,하지만이 사항 :

그러나, 콜백의 범위를 벗어나는 어떠한 기능/객체/변수를 인식하지 못합니다.

... 올바르지 않습니다. 함수는이 정의되어 범위의 모든에 액세스 할 수 있습니다, 그래서 예를 들면 :

var a = 10; 
function foo(b) { 
    bar(5); 
    function bar(c) { 
     alert(a + b + c); 
    } 
} 
foo(12); // alerts "27" 

bar는 바깥에서 c에, 또한 b에 (foo에 대한 호출에서)뿐만 아니라 액세스 및 a을 (한 방법 표시되는 범위).

예를 들어 콜백으로 전달되는 익명 함수는 정의 된 범위에있는 모든 항목에 액세스 할 수 있습니다. doAwesomeStuff은 다른 정보에 대한 액세스 권한을 가지고 있으므로 콜백에 필요한 모든 데이터를 전달해야합니다. 그래서 코드를 추측하고있어

은 다음과 같이 보입니다 :

function doAwesomeStuff(data) { 
    // ... 
} 

function doSomethingNifty() { 
    var a = 10, 
     b = 20; 
    someObject.getSomeData({option1:'value1', option2:'value2'}, 
     function(data) { 
      doAwesomeStuff(data); 
     } 
    ); 
} 

을 ... 당신은 doAwesomeStuffdoSomethingNifty에 대한 호출에서 ab에 액세스 할 수 있도록합니다. 그렇다면 유일한 옵션은 인수로 인수를 전달하거나 (아마도 가장 좋음) doSomethingNiftydoAwesomeStuff이 공유하는 변수 (아마도 이상적이지 않고 너무 많은 전역 변수)로 내보낼 수있는 유일한 옵션입니다.

+0

네가 맞아,하지만 뭔가 다른 의견 이었어. 자세한 내용은 내 자신의 질문에 내 의견을 참조하십시오. –

1

bind 비동기 메서드에 전달 된 함수에 필요한 변수가 있습니다.

또한 this SO question은 주제를 잘 처리합니다.

두 번째 버전은 즉시 액세스를 사용할 수없는 경우 데이터하려고하기 때문에, 전혀 작동하지 않을

+0

당신은 콜백에 대해 옳았습니다. 알아낼 수있었습니다 :) 내 기능이 제대로 정의되지 않았습니다. 위의 질문에 대한 내 의견을 참조하십시오. –

1

첫 번째 방법 (콜백이 호출되지 않았습니다 때까지입니다.) :

someObject.getSomeData({option1:'value1', option2:'value2'}, 
    function(data) { 
     doAwesomeStuff(data); 
    } 
); 

. 작동하지 않는 것에 대한 자세한 내용을 제공해주십시오.

getSomeData()은 실제로 콜백 기능을 호출하지 않을 수도 있습니다.

doAwesomeStuff()은 수신 된 데이터에서 다양한 변수를 수정할 수 있습니다. doAwesomeStuff()이 액세스 할 수있는 변수는 그 변수가 생성 된 곳 (범위)에서 사용할 수있는 변수입니다.

+0

맞습니다. 피드백에 대한 감사, 뭔가 다름! 자세한 내용은 내 자신의 질문에 위의 내 의견을 참조하십시오 –

관련 문제