자바스크립트 비동기 함수 질문

조회수 3273회

현재 자바스크립트로 웹 코딩을 하고있는중 고난을 겪고 있습니다.

함수를 사용하고 있는데 그 함수에서는 외부의 api를 받아오는데요.

예를들어 코드를

func a(id){
  return API(id);      
}

라고 해봅시다.

이때 func가 리턴을 제대로된 값을 하지않고 'undefined'을 리턴하는데요.

직접 alert()로 디버깅 하여보면 API의 결과는 잘 출력이 됩니다.

그런데 알아낸게 있는데 리턴값과 API을 둘다 alert하면 API가 먼저출력이 되는게 아니라 return 이 먼저 출력이 되어 'undefined'가 되는것 같습니다.

아마 API를 받아오는 속도가 느리고 비동기로 적용이 되어서 그런듯 한데 이러한 비동기형 상황을 동기형 함수로 어떻게 바꾸는지가 궁금합니다.

아니면 비동기, 동기문제가 아니면 어캐 해결하는지 알고싶습니다.

2 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    javascript로 웹프로그래밍을 하신다니 nodejs를 사용하시는 것 같은데 nodejs는 IO처리를 할 때 비동기식으로 동작하기 때문에 함수 호출 시 바로 리턴되는 것입니다. 비동기 함수를 호출하실 때에는 callback 함수를 사용하여 이벤트 처리를 합니다. 아마 API함수도 callback 함수를 인자로 받아서 호출이 끝나면 처리할 수 있게 되어 있을 것입니다. 따라서 다음과 같이 처리하시면 될 것 같습니다.

    func a(id, cb) {
        API(id, cb);
    }
    

    참고로 cb는 callback 함수입니다. 그리고, 다음 글을 참고하시면 비동기 프로그래밍을 이해하는데 도움이 되실 것 같습니다.

    http://www.nextree.co.kr/p7292/

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다. callback 함수 외부에서 사용하던 코드를 내부에 집어넣으니 되는군요 ㅎㅎ Joon 2016.4.27 11:36
  • API가 callback을 지원하지 않나요?

    아래 코드는 AWS S3관련 질문에서 가져온건데요. 아마존 웹서비스에 데이터를 올리는 API입니다.

    var s3 = new AWS.S3();
    
    var params = {
    //...중략
            };
    
    s3.putObject(params, function(err, data) {
        //err가 발생하면 err를 알려주고 성공하면 data를 던져주는 callback function
    });
    

    사용하시는 API에서 이런 형태로 callback function을 지원하는지 한 번 보시겠어요?

    • 감사합니다. callback 함수에 대하여 잘 몰랐는데 덕분에 잘 처리하게 되었습니다. Joon 2016.4.27 11:35

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)