Post

[JavaScript] async, await

[JavaScript] async, await

async, await

async, await을 사용해서 비동기 프로그래밍을 할 수 있다.

async 키워드를 사용해서 함수를 선언하게 되면 함수 내부에서 await 키워드를 사용할 수 있다.
await 키워드는 promise로 만든 함수에만 사용할 수 있다.
await을 사용하면 다음 코드를 실행하지 않고 promise를 기다린다.

하지만 스레드를 막고 있지는 않아서 함수 외부의 다른 코드는 실행된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const getPromise = (seconds) => new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve('완료');
  }, seconds * 1000);
});


// async 함수 선언
// async 함수 키워드로 함수를 선언하면 함수 내부에서 await 키워드를 사용할 수 있다.
async function runner(){
  const result1 = await getPromise(1);
  /*
  await은 promise에다가만 쓸 수 있다.
  await을 사용하면 Promise를 기다린다.
  await의 다음 코드가 await 키워드 뒤의 함수(Promise)가 끝날때 까지 실행되지 않는다.

  하지만 스레드를 막고 있지는 않아서
  runner() 함수 외부의 다른 함수는 실행된다.
  */

  console.log(result1);


  const result2 = await getPromise(2);
  console.log(result2);
  const result3 = await getPromise(1);
  console.log(result3);
}

runner();
console.log('실행 끝');


/*
실행 끝
완료
완료
완료
*/
// '실행 끝' 출력 후 1초 뒤에 '완료' 출력
// 그리고 2초 뒤에 '완료' 출력
// 그리고 1초 뒤에 '완료' 출력

resolve() 함수는 잘 실행이 되지만 reject() 함수를 사용하면 에러가 발생한다.
try, catch 문을 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const getPromise = (seconds) => new Promise((resolve, reject)=>{
  setTimeout(()=>{
    reject('에러');
  }, seconds * 1000);
});


async function runner(){

  try {
    const result1 = await getPromise(1);
    console.log(result1);
    const result2 = await getPromise(2);
    console.log(result2);
    const result3 = await getPromise(1);
    console.log(result3);
  }
  catch(e) {
    console.log('--- catch e ---');
    console.log(e);
  }
  finally() {
    console.log('--- finally ---');
  }
}

runner();
console.log('실행 끝');


/*
--- catch e ---
에러
--- finally ---
*/


참고
This post is licensed under CC BY 4.0 by the author.