๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/Vanilla JS

JS_๋ฌธ๋ฒ• (5)_๋™๊ธฐ/๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

by KASSID 2022. 2. 18.

๋™๊ธฐ์  ์ฒ˜๋ฆฌ

์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, ํ•ด๋‹น ์š”์ฒญ์— ์‘๋‹ต ๋ฐ›์•„ ๋‹ค์Œ ๋™์ž‘ ์‹คํ–‰

(ํ•œ ์ค„ ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ์ค„ ์ฒ˜๋ฆฌ)

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

์š”์ฒญ ๋ณด๋‚ธ ํ›„, ์‘๋‹ต์— ์ƒ๊ด€์—†์ด ๋‹ค์Œ๋™์ž‘ ์‹คํ–‰

(ํ•œ ์ค„ ์™„๋ฃŒ ์ƒ๊ด€์—†์ด ๋‹ค์Œ ์ค„ ์ฒ˜๋ฆฌ)

 


๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ?

๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค.

 

JS์˜ ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด

๊ธฐ๋‹ค๋ฆด ํ•„์š”์—†์ด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋„๋ก

๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด

JS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ์  ์ฒ˜๋ฆฌ

์ผ๋ถ€ ๊ธฐ๋Šฅ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ์ œ๊ณต

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ง€์› ๊ธฐ๋Šฅ

Rest API ์š”์ฒญ

ํŒŒ์ผ / DB ์ฒ˜๋ฆฌ

ํƒ€์ด๋จธ, ์•”ํ˜ธํ™” / ๋ณตํ˜ธํ™”

 

๋น„๋™๊ธฐ ์˜ˆ์‹œ

setTimeout ํ•จ์ˆ˜

setTimeout(functoin, milliseconds)

- millisecons : ms ๋งŒํผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

- function : ms๋งŒํผ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ํ˜ธ์ถœํ•  ํ•จ์ˆ˜

 

console.log("Hello")
setTimeout(() => {console.log("My name is")}, 3000)
console.log("Kassid")

>>>
Hello
Kassid
My name is

์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด

2๋ฒˆ ์งธ ์ค„์ด ์‹คํ–‰์ด ๋˜๊ณ  ์™„๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š์•˜์ง€๋งŒ

3๋ฒˆ ์งธ ์ค„์ด ์‹คํ–‰์ด ๋œ ๋ชจ์Šต๋‹ˆ๋‹ค.

 

(2๋ฒˆ ์งธ ์ค„์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ)

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฌธ์ œ์ ?

์˜ˆ์‹œ๋กœ

Rest API๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•œ ํ›„

๊ทธ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ•˜๋Š”๋ฐ

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ๋˜๋ฉด

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค..!!


ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

1. ์ฝœ๋ฐฑํ•จ์ˆ˜ callback

JS๋Š” first-class function์ด๋‹ค.

์ฆ‰,

ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ ๊ฐ€๋Šฅํ•˜๊ณ 

ํ•จ์ˆ˜์˜ ์ธ์ž์— ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ return๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

function func1(callback) { //ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
    setTimeout(()=>{
        console.log("func1")
        callback() //์ธ์ˆ˜๋กœ ๋ฐ›์•„์˜จ ํ•จ์ˆ˜ ์‹คํ–‰
    },100)
}

function func2() {
    console.log("func2")
}

func1(func2)

>>>
func1
func2

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด

์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ,,,,,

์ด๋ ‡๊ฒŒ ๊ณ„์† ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค.

 

2. Promise

callbackํ•จ์ˆ˜์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๋ฌธ๋ฒ•์ด๋‹ค.

1)
new๋กœ Promise์ƒ์„ฑ์„ํ•œ๋‹ค.

2)
Promise ๊ฐ์ฒด์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋Š” executor ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์ด ํ•จ์ˆ˜๋Š” new Promise๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ณ 
resolve, reject๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

3)
executor๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ›„
resolve, reject ํ•จ์ˆ˜ ํ˜ธ์ถœ
(resolve : ์„ฑ๊ณต ์‹œ / reject : ์‹คํŒจ ์‹œ)

 

then ๋ฉ”์„œ๋“œ

์„ฑ๊ณต, ์‹คํŒจ ์‹œ์˜ ์ˆ˜ํ–‰ ์ž‘์—… ์ •์˜ &

promise ์ฝ”๋“œ ์‹คํ–‰

 

promise.then(successCallback, failCallback)

 

 

 

 

const func = new Promise(
    (resolve, reject) => { 	//์„ฑ๊ณต, ์‹คํŒจ ํ•จ์ˆ˜์ธ์ˆ˜๋กœ ๋ฐ›๊ธฐ
        setTimeout(() => { 	//๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰
            let num = 10	
            if (num > 9) {	
                resolve(num)	//successCallback
            } else {
                reject("error")	//failCallback
            }
        }, 1000);
    }
)

func.then((item) => { 	//successCallback
    console.log('success', item)    
}, (err) => {		//failCallback
    console.log(err)
})

>>>
success 10

 

๋งŒ์•ฝ then ๋ฉ”์„œ๋“œ์— ํ•˜๋‚˜๋งŒ ์„ ์–ธํ•œ๋‹ค๋ฉด

successCallback ๋™์ž‘๋งŒ ์„ ์–ธํ•œ ์…ˆ์ด๋‹ค.

func.then((item) => { 	//successCallback
    console.log('success', item)    
})

๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฒ”์œ„๋Š”

Promise์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ ์ด๋‹ค.

 

 

const func = new Promise(
    (resolve, reject) => { 	//์„ฑ๊ณต, ์‹คํŒจ ํ•จ์ˆ˜์ธ์ˆ˜๋กœ ๋ฐ›๊ธฐ
        setTimeout(() => { 	//๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰
            let num = 10	
            if (num > 9) {	
                resolve(num)	//successCallback
            } else {
                reject("error")	//failCallback
            }
        }, 1000);
    }
)

func.then((item) => { 	//successCallback
    console.log('success', item)    
}, (err) => {		//failCallback
    console.log(err)
})
console.log("Hello")

>>>
Hello
success 10

๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์‹œ์—์„œ

Hello๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ณ„์†ํ•ด์„œ ์ด์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

์•„๋ž˜์™€ ๊ฐ™์ด

.then์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

 

 

const func = new Promise(
    (resolve, reject) => { 	//์„ฑ๊ณต, ์‹คํŒจ ํ•จ์ˆ˜์ธ์ˆ˜๋กœ ๋ฐ›๊ธฐ
        setTimeout(() => { 	//๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰
            let num = 10	
            if (num > 9) {	
                resolve(num)	//successCallback
            } else {
                reject("error")	//failCallback
            }
        }, 1000);
    }
)

func.then((item) => { 	//successCallback
    console.log('success', item)    
}, (err) => {		//failCallback
    console.log(err)
}).then(()=>{
    console.log("Hello")
})


>>>
success 10
Hello

 

์ •๋ฆฌํ•˜๋ฉด

๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ค‘๊ฐ„์— ์žˆ๊ณ ,

์ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ๋’ค์— 

์ด์–ด์ ธ์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋“ค์˜ ๊ฒฝ์šฐ์—๋Š”

Promise๋ฅผ ์ด์šฉํ•ด์„œ

์ˆœ์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋Œ“๊ธ€