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

조회수 1703회

 // ...

var foo, bar

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

 // ...

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

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

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 사용을 권장합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 정대원님의 의견대로 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 값이 모두 전달 된 경우, ... 
    });
    
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)