Jieunny์˜ ๋ธ”๋กœ๊ทธ

[TS] Promise์™€ async/await ๊ตฌ๋ฌธ ๋ณธ๋ฌธ

Study/TypeScript

[TS] Promise์™€ async/await ๊ตฌ๋ฌธ

Jieunny 2023. 2. 6. 16:08

๐Ÿ“ฃ  ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

๐Ÿ“ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ API

โžฐ ๋…ธ๋“œ์ œ์ด์—์Šค๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋‘” fsํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

โžฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ๋ฒ„์ „์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ œ๊ณตํ•œ๋‹ค.

โžฐ ์ด๋ฆ„์— Sync๊ฐ€ ๋ถ™์€ ๊ฒƒ์ด ๋™๊ธฐ ๋ฒ„์ „์ด๋‹ค.

import {readFileSync, readFile} from 'fs'

// ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฝ๋Š” ์˜ˆ
const buffer: Buffer = readFileSync('./package.json')
console.log(buffer.toString())

// ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฝ๋Š” ์˜ˆ
readFile('./package.json', (error: Error, buffer: Buffer) => {
	console.log(buffer.toString())
}

// Promise์™€ async/await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ์˜ˆ
const readFilePromise = (filename: string): Promise<string> =>
    new Promise<string>((resolve, reject) => {
        readFile(filename, ((error: Error, buffer: Buffer) => {
            if(error) reject(error)
            else resolve(buffer.toString())
        })
    });
    
(async () => {
    const content = await readFilePromise('./package.json')
    console.log(content)
})()

โžฐ API ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ ํ•˜๋“œ๋””์Šคํฌ์— ์ €์žฅ๋œ ํŒŒ์ผ์„ ์ฝ๋Š” ๋“ฑ ์‹คํ–‰ ์‹œ ๋ฌผ๋ฆฌ์ ์ธ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

โžฐ ๋™๊ธฐ ๋ฐฉ์‹ API : ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ฝ์„ ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์ž ์‹œ ๋ฉˆ์ถ”๋Š” ๋ฐฉ์‹

โžฐ ๋น„๋™๊ธฐ ๋ฐฉ์‹ API : ๋™์ž‘์„ ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๋Œ€์‹  ๊ฒฐ๊ณผ๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์–ป๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹

โžฐ ๋น„๋™๊ธฐ API์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ '๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜' ๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ API์˜ ๋ฌผ๋ฆฌ์ ์ธ ๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ“ readFIleSync์™€ readFile API

โžฐ ๋…ธ๋“œ์ œ์ด์—์Šค์—์„œ ํŒŒ์ผ ์ฝ๊ธฐ๋Š” readFileSync๋ผ๋Š” API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

โžฐ readFileSync๋Š” ํŒŒ์ผ์„ ์ฝ์–ด์„œ Buffer๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค.

โžฐ Buffer๋Š” ๋…ธ๋“œ์ œ์ด์—์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

โžฐ Buffer์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค ๋•Œ๋Š” Buffer์˜ toString ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

1๏ธโƒฃ readFileSync : ๋™๊ธฐ ๋ฒ„์ „

readFileSync(path: string): Buffer
import {readFileSync} from 'fs'

const buffer: Buffer = readFileSync('./package.json')
// ํŒŒ์ผ์„ ๋‹ค ์ฝ์–ด์˜ฌ ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋Š” ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ˜๋‹ค.
const content: string = buffer.toString()
console.log(content)
// package.json ํŒŒ์ผ์˜ ํ…์ŠคํŠธ ๋‚ด์šฉ

 

2๏ธโƒฃ readFIle : ๋น„๋™๊ธฐ ๋ฒ„์ „

โžฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด ์˜ˆ์™ธ๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•œ๋‹ค.

readFile(ํŒŒ์ผ ๊ฒฝ๋กœ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜: (error: Error, buffer: Buffer) => void)
import {readFile} from 'fs'

readFile('./package.json', (err: Error, buffer: Buffer) => {
    if(err) throw err	// ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ
    else {
        const content: string = buffer.toString()
        console.log(content)
        // package.json ํŒŒ์ผ ๋‚ด์šฉ
    }
})
// ์ฝ”๋“œ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์† ์‹คํ–‰

โžฐ package.json ํŒŒ์ผ์„ ์ฝ๋Š” ๊ฒฐ๊ณผ๋Š” readFile() ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.

 

๐Ÿ“ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์™€ ๋น„๋™๊ธฐ API

โžฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ๋  ์ˆ˜ ์žˆ์œผ๋ฉด ๋™๊ธฐ API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

โžฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋˜ํ•œ ES5 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋˜์–ด ์‹คํ–‰๋˜๋ฏ€๋กœ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

โž• ๋‹จ์ผ์Šค๋ ˆ๋“œ?

๋”๋ณด๊ธฐ

โžฐ ์Šค๋ ˆ๋“œ : CPU๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋™์ž‘์‹œํ‚ค๋Š” ์ตœ์†Œ ๋‹จ์œ„

โžฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ํ•œ ๊ฐœ์˜ ์ž‘์—… ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค.

โžฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™๊ธฐ API๊ฐ€ ์‹คํ–‰๋˜๋ฉด, ๋™๊ธฐ API๊ฐ€ ์‹คํ–‰๋œ ์ฝ”๋“œ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ˜ ๋‹ค์Œ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹ค์ œ ์ž‘์—…์„ ์‹คํ–‰ํ•ด ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ฉด ๊ทธ๋•Œ์„œ์•ผ ๋น„๋กœ์†Œ ๋ฉˆ์ท„๋˜ ๋™๊ธฐ API๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โžฐ ์ด๋Ÿฐ ๋™์ž‘ ๋ฐฉ์‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐ˜์‘์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค.

 

๐Ÿ“ ์ฝœ๋ฐฑ ์ง€์˜ฅ

โžฐ ๋น„๋™๊ธฐ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ๋‹ค์‹œ ๋˜ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ๊ฐ€ ์žˆ๋‹ค.

โžฐ ์ด๋Ÿฐ ๋ณต์žกํ•œ ํ˜•ํƒœ๋กœ ์–ฝํžŒ ์ฝœ๋ฐฑ ๊ตฌ์กฐ๋ฅผ ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ผ๊ณ  ํ•œ๋‹ค.

โžฐ ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 'Promise' ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.


๐Ÿ“ฃ  Promise ์ดํ•ดํ•˜๊ธฐ

โœ”๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ”„๋กœ๋ฏธ์Šค๋Š” Promise๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋ž˜์Šค์ด๋‹ค.

โžฐ Promise ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” new ์—ฐ์‚ฐ์ž๋กœ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

โžฐ ์ด๋•Œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

const promise = new Promise(์ฝœ๋ฐฑ ํ•จ์ˆ˜)

โžฐ Promise์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve์™€ reject๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค.

(resolve, reject) => {}

โžฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ Promise๋Š” ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

const numPromise: Promise<number> = new Promise<number>(์ฝœ๋ฐฑ ํ•จ์ˆ˜)

new Promise<T>((
    resolve: (sucessValue: T) => void,
    reject: (any) => void)
) => {
	//...
}

 

๐Ÿ“ resolve์™€ reject ํ•จ์ˆ˜

// readFile์„ ํ˜ธ์ถœํ•˜๋Š” ๋‚ด์šฉ์„ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ
import {readFile} from 'fs'

export const readFilePromise = (filename: string): Promise<string> => 
    new Promise<string>((
        resolve: (value: string) => void,
        reject: (error: Error) => void) => {
            readFile(filename, (err: Error, buffer: Buffer) => {
                if(err) reject(err)
                else resolve(buffer.toString())
            })
        })

โžฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋Š” reject(err) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ๋Š” ํŒŒ์ผ ๋‚ด์šฉ์ด ๋‹ด๊ธด buffer๋ฅผ ์ด์šฉํ•ด resolve(buffer) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

// ์œ„์—์„œ ๊ตฌํ˜„ํ•œ readFilePromise ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ
import {readFilePromise} from './readFilePromise'

readFilePromise('./package.json')
    .then((content: string) => {
        console.log(content) // package.json ํŒŒ์ผ์„ ์ฝ์€ ๋‚ด์šฉ
        return readFilePromise('./tsconfig.json')
    })
    .then((content: string) => {
        console.log(content) // tsconfig.json ํŒŒ์ผ์„ ์ฝ์€ ๋‚ด์šฉ
        // catch ์ชฝ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
        return readFilePromise('.')
    })
    .catch((err: Error) => console.log('error:', err.message))
    .finally(() => console.log('ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ'))

โžฐ resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ’์€ then ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ชฝ์— ์ „๋‹ฌ๋˜๊ณ , reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ’์€ catch๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ชฝ์— ์ „๋‹ฌ๋œ๋‹ค.

โžฐ ๋งˆ์ง€๋ง‰์— 'ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ'๋ผ๋Š” ์ถœ๋ ฅ์ด ๋‚˜์˜ค๋ฉด ์ด๋Š” finally ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

โžฐ Promise ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ์ฒด์ธ ์ฝ”๋“œ์—์„œ finally๋Š” ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋œ๋‹ค.

 

๐Ÿ“ Promise.resolve ๋ฉ”์„œ๋“œ

โžฐ Promise ํด๋ž˜์Šค๋Š” resolve๋ผ๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

โžฐ ์•ž์„œ Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ˜ธ์ถœํ•œ resolve ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

โžฐ Promise.resolve(๊ฐ’) ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ ์ด '๊ฐ’'์€ then ๋ฉ”์„œ๋“œ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Promise.resolve(1)
    .then(value => console.log(value)) // 1

 

๐Ÿ“ Promise.reject ๋ฉ”์„œ๋“œ

โžฐ Promise.reject(Error ํƒ€์ž… ๊ฐ์ฒด)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด 'Error ํƒ€์ž… ๊ฐ์ฒด'๋Š” ํ•ญ์ƒ catch ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Promise.reject(new Error('์—๋Ÿฌ ๋ฐœ์ƒ'))
    .catch((err: Error) => console.log('error:', err.message))

 

๐Ÿ“ then-์ฒด์ธ

Promise.resolve(1)
    .then((value: number) => {
        console.log(value) // 1
        return Promise.resolve(true)
   })
   .then((value: boolean) => {
       console.log(value) // true
       return [1, 2, 3]
   })
   .then...

โžฐ Promise์˜ then ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋”ฐ.

โžฐ ์ด then์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์€ ๋˜ ๋‹ค๋ฅธ then ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ’์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ then ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜ํ™˜๋œ ๊ฐ’์ด Promise ํƒ€์ž…์ด๋ฉด ์ด๋ฅผ resolveํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋งŒ์•ฝ reject ๋‹นํ•œ ๊ฐ’์ผ ๋•Œ๋Š” catch ๋ฉ”์„œ๋“œ์—์„œ ์ด ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ Promise.all ๋ฉ”์„œ๋“œ

all(ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋ฐฐ์—ด: Promise[]): Promise<ํ•ด์†Œ๋œ ๊ฐ’๋“ค์˜ ๋ฐฐ์—ด(ํ˜น์€ any)>

โžฐ Promise ๊ฐ์ฒด๋“ค์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ›์•„, ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ resolve๋œ ๊ฐ’๋“ค์˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

โžฐ ์ด ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋˜ ๋‹ค๋ฅธ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, resolve๋œ ๊ฐ’๋“ค์˜ ๋ฐฐ์—ด์€ then ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์–ป์–ด์•ผ ํ•œ๋‹ค.

โžฐ ๋ฐฐ์—ด์— ๋‹ด๊ธด Promise ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜๋ผ๋„ reject ๋˜๋ฉด ๋” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ•ด๋‹น ๊ฑฐ์ ˆ ๊ฐ’์„ ๋‹ด์€ Promise.reject ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๐Ÿ“ Promise.race ๋ฉ”์„œ๋“œ

race(ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋ฐฐ์—ด: Promise[]): Promise<๊ฐ€์žฅ ๋จผ์ € ํ•ด์†Œ๋œ ๊ฐ์ฒด์˜ ๊ฐ’ ํƒ€์ž…(ํ˜น์€ Error)>

โžฐ ๋ฐฐ์—ด์— ๋‹ด๊ธด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜๋ผ๋„ resolve ๋˜๋ฉด ์ด ๊ฐ’์„ ๋‹ด์€ Promise.resolve ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โžฐ ๊ฑฐ์ ˆ ๊ฐ’์ด ๊ฐ€์žฅ ๋จผ์ € ๋ฐœ์ƒํ•˜๋ฉด Promise.reject ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋ฐฐ์—ด์˜ ๋งจ ์ฒ˜์Œ์ด reject์ผ ๊ฒฝ์šฐ)


๐Ÿ“ฃ  async์™€ await ๊ตฌ๋ฌธ

๐Ÿ“ await ํ‚ค์›Œ๋“œ

โžฐ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

โžฐ ๋งŒ์ผ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ Promise ๊ฐ์ฒด์ด๋ฉด then ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์–ป์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

let value = await Promise ๊ฐ์ฒด ํ˜น์€ ๊ฐ’

 

๐Ÿ“ async ํ•จ์ˆ˜ ์ˆ˜์ •์ž

โžฐ await ํ‚ค์›Œ๋“œ๋Š” ํ•ญ์ƒ async๋ผ๋Š” ์ด๋ฆ„์˜ ํ•จ์ˆ˜ ์ˆ˜์ •์ž๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜ ๋ชธํ†ต์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
export const test1 = async() => {
    let value = await 1
    console.log(value) // 1
    value = await Promise.resolve(1)
    console.log(value) // 1
}

// function ํ•จ์ˆ˜ 
export async function test2(){
    let value = await 'hello'
    console.log(value) // hello
    value = await Promise.resolve('hello')
    console.log(value) // hello
}

 

test1()
test2()

// 1
// hello
// 1
// hello

โžฐ  ๋‘ ํ•จ์ˆ˜๊ฐ€ ๋งˆ์น˜ ๋™์‹œ์— ์‹คํ–‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 

๐Ÿ“ async ํ•จ์ˆ˜์˜ ๋‘ ๊ฐ€์ง€ ์„ฑ์งˆ

โœ”๏ธ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ Promise ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โžฐ ์œ„ ์ฝ”๋“œ๋Š” async ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ ์˜ˆ์ด๋‹ค.

โžฐ ๋ฐ‘ ์ฝ”๋“œ๋Š” async ํ•จ์ˆ˜๋ฅผ Promise ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•œ ์˜ˆ์ด๋‹ค.

test1()
    .then(() => test2())
    
// 1
// 1
// hello
// hello

โžฐ test1() ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด resolve๋œ ๋‹ค์Œ์— ๋น„๋กœ์†Œ test2() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ๋‚˜์˜จ๋‹ค.

 

๐Ÿ“ async ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ์˜๋ฏธ

โžฐ async ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ๋ฐ˜ํ™˜๊ฐ’์€ Promise ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋˜๋ฏ€๋กœ ๋‹ค์Œ์ฒ˜๋Ÿผ then ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด async ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์–ป์–ด์•ผ ํ•œ๋‹ค.

const asyncReturn = async() => {
    return [1, 2, 3]
}

asyncReturn() 
    .then(value => console.log(value)) // [1, 2, 3]

 

๐Ÿ“ async ํ•จ์ˆ˜์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

const asyncException = async() => {
    throw new Error('error')
}

asyncException() // ์˜ˆ์™ธ ๋ฐœ์ƒ

โžฐ async ํ•จ์ˆ˜์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.

โžฐ ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” asyncException์„ ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์ด ์•„๋‹Œ asyncException()์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ catch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

const asyncException = async() => {
    throw new Error('error')
}
asyncException()
    .catch(err => console.log('error:', err.message))	//error: error

 

โžฐ await ๊ตฌ๋ฌธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

const awaitReject = async() => {
    await Promise.reject(new Error('error'))
}

awaitReject()
    .catch(err => console.log('error:', err.message)) // error: error

โžฐ await ๊ตฌ๋ฌธ์—์„œ Promise.reject ๊ฐ’์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์œผ๋ ค๋ฉด catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“ async ํ•จ์ˆ˜์™€ Promise.all

import {readFilePromise} from './readFIlePromise'

const readFilesAll = async(filenames: string[]) => {
    return await Promise.all(
        filenames.map(filename => readFilePromise(filename))
    )
}

readFilesAll(['./package.json', './tsconfig.json'])
    .then(([packageJson, tsconfigJson]: string[]) => {
        console.log('<package.json>: ', packageJson)
        console.log('>tsconfig.json>: ', tsconfigJson)
    })
    .catch(err => console.log('error:', err.message))

โžฐ readFilesAll ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ filenames์— ๋‹ด๊ธด string[] ํƒ€์ž… ๋ฐฐ์—ด์— map ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•ด์„œ Promise[] ํƒ€์ž… ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค.

โžฐ ๊ทธ ๋‹ค์Œ, ์ด๋ฅผ ๋‹ค์‹œ Promise.all ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹จ์ผ Promise ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค.

โžฐ ์ด ๊ฒฐ๊ณผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์— await ๊ตฌ๋ฌธ์„ ์ ์šฉํ•ด resolve๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โžฐ readFilesAll ํ•จ์ˆ˜๋ฅผ Promise ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•ด์„œ then๊ณผ catch ๋ฉ”์„œ๋“œ๋ฅผ then- ์ฒด์ธ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค (์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค)