3

이 응용 프로그램의 복잡성 때문에 Facebook API 호출을 래핑 할 필요가 있습니다.익명 함수 범위에서 데이터 추출

//In main file, read is always undefined 
var read = fb_connect.readStream(); 

// In fb_wrapper.js 
function readStream() { 
    var stream; 

    FB.api('/me/feed', {limit:10000}, function (response) { 
     stream = response.data; 
    }); 

    return stream; 
} 

나는 인해 호출의 비동기 특성으로 readStream() 함수의 나머지 (값이없는 한) stream를 반환 할 것이라는 점을 알고있다. 콜백 함수 범위 밖으로 데이터를 가져 오는 방법을 찾고 더 높은 범위로 백업하는 데 문제가 있습니다. FB API 호출이 잘 돌아 왔으며 (백 번 디버깅했습니다), 응답 데이터를 얻는 것은 지금까지 전투였습니다.

누구든지 의견이 있으면 크게 감사하겠습니다. 나는 운이 좋은 페이스 북 jQuery 플러그인을 미리 검색했다.

답변

2

귀하의 질문에 따르면, 그것은 당신이 동기 호출을 찾고있는 것 같습니다. 즉, API 호출에서 반환 된 데이터를 호출 한 후에 사용할 수 있습니다. 이 경우 FB.api가 동기 호출을 지원하는지 확인해야합니다 (대부분 지원하지 않음).

그렇지 않은 경우 비동기으로 전화해야 함을 이해해야합니다. 즉, 처리 코드를 FB.api로 전달하는 콜백 함수에 넣어야 함을 의미합니다. 이를 코드 작성의 "연속"스타일이라고하며 비동기 호출을 사용하는 표준 방법입니다.

FB.api('/me/feed', {limit:10000}, function (response) { 
    var stream = response.data; 
    // Do your processing here, not outside!!! 
}); 

또는 : 답장을

function handlerFunction(response) { 
    // Do your processing here 
} 

FB.api('/me/feed', {limit:10000}, handlerFunction); 
+0

감사합니다. 정말, 난 더 많은 OO 응용 프로그램을 가질 수 있도록 이러한 API 호출에 대한 래퍼를 찾고 있어요. 다음과 같이 모델링됩니다 :'app.FBAPICall()'그리고이 호출로부터 값을 반환 할 수 있습니다. 그러나 비동기 처리기는 내 응용 프로그램 개체가 아니라 JS 스레드의 최상위 개체에서 호출됩니다. – Mark

+0

네 말이 맞아. 비동기 호출에는 일반 절차 적 스타일과 완전히 다른 코딩의 "연속"스타일이 필요합니다. "연속"스타일에서는 안쪽에서 코드를 만듭니다. JavaScript가 단일 스레드이기 때문에 비동기 JavaScript 호출을 동기화 호출로 변환하는 것이 항상 쉬운 일은 아닙니다 (언급 한 바와 같이 JS 스레드가 콜백을 호출하므로 차단하면 안됩니다). –