2010-06-29 3 views
2

저는 자바 스크립트에서 콜백 형식의 프로그래밍을 처음 사용합니다. 함수 호출이 콜백을 통해 완료 될 때까지 기다리는 코드가 있습니까? 설명해 드리겠습니다. 다음 함수는 숫자를 취해이를 기반으로 결과를 반환합니다.자바 스크립트에서 콜백이 호출 될 때까지 일시 중지

function get_expensive_thing(n) { 
    return fetch_from_disk(n); 
} 

지금까지 쉽게 알 수 있습니다. 그러나 fetch_from_disk 대신 콜백을 통해 결과를 반환하면 어떻게해야합니까? 과 같이하십시오 return 익명 함수의 범위, 보다는 get_expensive_thing 기능에 있기 때문에

function get_expensive_thing(n) { 
    fetch_from_disk(n, function(answer) { 
    return answer; // Does not work 
    }); 
} 

위는 작동하지 않습니다.

두 가지 가능한 "해결책"이 있지만 모두 부적절합니다. 하나는 자체가 콜백 대답에 get_expensive_thing를 리팩토링하는 것입니다

function get_expensive_thing(n, callback) { 
    fetch_from_disk(n, function(answer) { 
    callback(answer); 
    }); 
} 

다른 하나는 fetch_from_disk을 코딩하는 것입니다,하지만이 옵션을 선택하지 않습니다. 즉, fetch_from_disk 콜백을 호출 할 때까지, 그 답을 반환 기다립니다 - get_expensive_thing 의 원하는 동작을 유지하면서

우리는 어떻게 원하는 결과 를 달성 할 수 있습니까?

답변

2

거의 브라우저 자바 스크립트에 "대기 중"이 없습니다. 콜백이 전부입니다. 콜백은 "클로저 (closure)"일 수 있습니다. 즉, 로컬 변수가 생성 된 컨텍스트에서 "캡처"하는 함수의 정의를 의미합니다.

이런 일을하는 방식을 채택하면 더 행복 할 것입니다.

+0

에 추가 할 수 있습니다. – JohnFx

+0

그 정도면 충분합니다. 여기 내 목적은 콜백을 통해 얻은 값을 반환하는 함수를 만드는 것이 실제로 불가능하다는 것을 확실히 확인하는 것이 었습니다. – jameshfisher

0

는 기다릴 수하더라도, 당신은 그 일을하여 응답하지 않는 브라우저 요구되는 실종 반환 :

function get_expensive_thing(n) { 
    return fetch_from_disk(n, function(answer) { 
    return answer; 
    }); 
} 
+0

아마도이 사실을 분명히 알지 못했을 것입니다 :이 예제에서,'fetch_from_disk'는 콜백을 통해 결과를 대신 반환하도록 동작을 변경했습니다. 그래서 그 반환 값은 실제로'undefined '입니다. – jameshfisher

+0

당신은 분명히했지만, 많은 사람들도 콜백 결과를 반환합니다, fetch_from_disk (n, c) {return c (val)} -이게 잡음인지 사과 해주세요 :) – nathan

관련 문제