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


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

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

예를들어 코드를

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

라고 해봅시다.

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

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

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

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

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

  • 2016년 04월 27일에 작성됨

조회수 384


2 답변


좋아요
2
싫어요
채택취소하기

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

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

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

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

  • 2016년 04월 27일에 작성됨
    Polyglot Programmer

  • 감사합니다. 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을 지원하는지 한 번 보시겠어요?

  • 2016년 04월 27일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

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

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close