IT/CS

[JavaScript] 자바스크립트 비동기적 프로그래밍

Terriermon 2021. 12. 7. 23:44

개발 언어에 익숙하지만 JavaScript의 동기/비동기가 헷갈린 사람들에게


JavaScript는 한 번에 한 가지 일만 한다.

자바스크립트는 단일 스레드에서 동작한다. 따라서, 한 번에 한 가지 일만 할 수 있다.

 

그러나 자바스크립트는 비동기적 프로그래밍을 할 수 있다. 아래 세 가지에서 크게 사용한다.

- 네트워크 요청

- 파일 읽기/쓰기

- 의도적인 시간 지연

 

콜백(callback) ➡️ 프라미스(promise) ➡️ async/await 순으로 발전하면서 자바스크립트에서 비동기를 쉽게 사용할 수 있다.

 

콜백과 콜백 지옥

콜백

test.function1(v1, function(){
    	//function1이 끝난 후, 익명함수가 시작된다.
    });

나중에 동작할 함수, 보통 실행할 함수 뒤에 익명 함수를 쓴다.

 

 

콜백 지옥

test.function1(v1, function(){
    function2(v2, function(){
        function3(v3, function(){
            function4(v4, function(){

            });
        });
    });

기다려야 할 것이 많다면, 콜백이 중첩되어 쌓이게 된다. 이것이 콜백 지옥이다.

 

 

프라미스

프라미스 기반 비동기 함수를 호출하면, 함수는 Promise 인스턴스를 반환한다.

프라미스는 오직 resovle(성공), reject(실패)만 반환한다.

why? 프라미스는 왜 생겨난 것인가
- 콜백 지옥을 간단하게 하기 위해
- 프라미스 객체로 어디서든 전달할 수 있기 때문
 > 다른 함수에서 프라미스 객체를 가지고 처리할 수 있다.

 

프라미스 만들기

function promiseExample(){
    return new Promise(function(resolve, reject){
        //해당 함수가 끝나면 성공or실패를 반환한다.
    });
}


//실행
promiseExample()
.then(function(){
	//resolve시, 함수 실행
})
.catch(function(err){
    //reject시, 함수 실행
})

 

하지만, 프라미스도 콜백 지옥 처럼 함수가 중첩될 위험이 있다.

 

 

Async/Await

Async 함수는 내부에서 프라미스를 사용해 비동기 요청 결과를 반환한다.

> 프라미스보다 가독성이 좋아 ES8에서 새롭게 나오게 되었다.

 

Await프라미스의 결과를 기다린다. async와 짝을 이뤄, 반드시 async 함수 안에서 선언된다.

 

 

async/await 예시

function asyncWork(v){
    return new Promise( (resolve, reject) => {
        setTimeout(()=>{
            console.log(v);  
        }, 1000);
    })
}

var asyncFunc = async function(){
    let res = await asyncWork(1);
    res = await asyncWork(2);
    res = await asyncWork(3);
}
결과
1
2
3

 

async/await 코드 설명

1. async 함수를 실행하게 되면, async 함수 안의 promise를 실행한다.

2. await이 있는 promise는 이행 완료가 될 때 까지, 다음 행의 코드를 실행하지 않고 대기한다.

3. promise가 resolve되면, 다음 코드를 실행한다.

-> 비동기를 순차적으로 실행

 

 

Async 함수에는 반드시 Promise를 선언해야 하는가?

아니다. Async 함수는 명시적으로 Promise를 선언하지 않아도 항상 Promise 객체를 반환한다.

'IT > CS' 카테고리의 다른 글

[DB] 데이터 모델링의 이해 - 물리 모델링 절차  (0) 2022.04.24
[DB] 데이터 모델링의 이해 - 논리 모델링 절차  (0) 2022.04.13
[Architecture] MSA  (0) 2021.09.28
[Java] Lambda expression  (0) 2021.09.28
[JavaScript] jQuery  (0) 2021.08.22