비동기 처리에 대한 고찰 (콜백) (1)

비동기 처리에 대한 고찰

비동기처리란 한명의 사람이 마치 한꺼번에 2가지 3가지 일을 하는 것처럼 보이게 할 수 있는 기술입니다. 조금 더 상세하게 설명을 하면 비동기함수가 처리되는 동안에 다른 일을 하면서 비동기함수가 처리되는 것을 기다리게 되고 오래 걸리는 작업을 비동기처리 함으로써 매끄럽게 프로그램이 작동하게 할 수 있습니다.

자바스크립트는 싱글스레드 언어이므로 비동기처리가 필수불가결합니다.

비동기 처리의 예

  • ajax 호출과 같은 네트워크 요청
  • 파일을 읽고 쓰는 작업
  • 의도적으로 시간을 지연시키는 작업(setTimeOut)

비동기 처리하는 방법

1. 콜백

콜백 함수란 다른 함수의 인자로써 이용되는 함수 혹은 어떤 이벤트에 의해 호출되어지는 함수를 일컫습니다.

  • 함수의 인자로써 이용되는 함수의 예

    function printAnumber(number, callbackFucntion) {
        console.log(`number is ${number}`)
    	callbackFunction()
    }
    
    function printFinish () {
        console.log('number printing is Finish')
    }
    
    printAnumber(6, printFinish)
    
  • 이벤트에 의해 호출되어지는 함수의 예

    function hadleClick() {
        console.log('clicked!')
    }
    
    onClick(handleClick)
    

    클릭이 될때마다 handleClick을 실행합니다

비동기 처리에서의 콜백

function asyncPrintFunction () {
    setTimeOut(function() {
        console.log('now print')
    }, 500)
}

ayncPrintFunction()
conosole.log('print finish')
// print finish
// 0.5초후
// now print

이와 같이 비동기 함수를 사용하다 보면 생각과는 다르게 동작할 수 있습니다.

function getUser() {
    let user
    setTimeout(function() {
    	user = {
            name: 'john',
            age: 30,
        }    
    }, 100)
    return user
}

const user = getUser()
console.log(user)

// undefined

유저 정보를 불러오는 함수를 비동기 처리 하였지만 비동기 처리가 끝나지 않은채로 리턴하여서 undefined가 리턴 되었습니다. 이를 해결하기 위해 우리는 콜백 함수를 이용할 수 있습니다.

function gerUser(callbackFunction) {
    let user
    setTimeout(function(callbackFunction) {
        user = {
            name: 'john',
            age: 30
        }
        callbackFunction(user)
    }, 100)
}

getUser(function(user){
    console.log(user)
})

// 0.1초 후
// { name: 'john', age: 30 }

콜백함수를 이용하면 이와 같이 우리가 원하던 결과를 얻어 낼 수 있습니다.

이런 결과를 얻을 수 있는 것은 비동기 처리를 한 후에 콜백 함수를 실행하기 때문에 다음과 같은 결과를 얻을 수 있습니다. 이는 Event Loop에 관해 이해가 필요하므로 다음에 한번 다뤄 보도록 하겠습니다.

참고 사이트

https://www.daleseo.com/js-async-callback/

참고 도서

Learning Javascript (한빛미디어)