콜백함수 2개에서 값을 받은 후에 함수를 호출하려면 어떻게 해야할까요?



 // ...

var foo, bar

foobar.first(function (value) {
    foo = value
})
foobar.second(function (value) {
    bar = value
})
function next() {
    // ...
}

 // ...

이런형식으로 되어있는 코드입니다

전역변수에 2개의 콜백함수로 받은 값이 들어온 다음에 next() 함수를 호출하고 싶은데 어떻게 해야할까요?

  • 2016년 09월 07일에 작성됨

조회수 96


2 답변


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

가장 단순하게 해결하는 방식은 각 변수가 초기화 되었는지를 체크하는 것 입니다. 싱글 쓰레드로 실행되기 때문에 레이스 컨디션 등 동기화 문제가 발생하지 않습니다.

var foo, bar

foobar.first(function (value) {
    foo = value

    if (foo && bar) { 
      next(); 
    }

})
foobar.second(function (value) {
    bar = value

    if (foo && bar) { 
      next(); 
    }
})

function next() {
    // ...
}

물론 실무에서 위 코드처럼 사용하는 경우는 많이 없고, async.js과 같은 모듈을 사용하시면 비동기 문제를 비교적 쉽게 해결 가능합니다.

장기적으로는 발전된 방식인 promise 사용을 권장합니다.

  • 2016년 09월 08일에 작성됨
    프로그래밍 언어를 좋아하는 프로그래머


정대원님의 의견대로 Promise를 사용해보시는 것이 좋을 것 같습니다. jQuery의 DeferredPromise로 간단히 바꿔보면 다음과 같이 변경할 수 있을 것 같네요. 참고하시기 바랍니다.

var fooDeferred = $.Deferred();
var barDeferred = $.Deferred();

foobar.first(function (value) {
    fooDeferred.resolve(value);
})
foobar.second(function (value) {
    barDeferred.resolve(value);
})

$.when(fooDeferred.promise(), barDeferred.promise()).done(function(foo,bar) {  
  // foo,bar 값이 모두 전달 된 경우, ... 
});

  • 2016년 09월 08일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

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

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